启用具有多个布尔可观察标志的绑定

Enable binding with multiple boolean observable flags

本文关键字:观察 标志 绑定 布尔可 启用      更新时间:2023-09-26

尝试使用基于两个标志的数据绑定来绑定启用状态。如果flagA为true并且flagB为false,则我们需要启用输入框。

var viewModel = function () {
    var self = this;
    self.flagA = ko.observable(true);
    self.flagB = ko.observable(false);
    self.changeState = function () {
        self.flagA(false);
    }
}
 
ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type='text' data-bind='enable: flagA && !flagB' />
<button data-bind='click:changeState'>changeState</button>

有人能帮我找出为什么它不起作用吗?

我尝试过使用enable:function(){flagA && !flagB}这样的函数来实现这一点。但它不起作用:当我使用按钮更改状态时,它不会观察到。

因为flagAflagB是可观察性的(它们是函数),所以如果在表达式中使用它们,则需要在没有任何参数的情况下调用它们来获得值:

<input type='text' data-bind='enable: flagA() && !flagB()' />

演示JSFiddle。

尽量避免在视图中添加逻辑,这是一种糟糕的做法。为此,添加computed变量

self.isEnabled = ko.computed(function() {
        return this.flagA() && !this.flagB()
    }, this);

并像往常一样绑定:

<input type='text' data-bind='enable: isEnabled' />

参见fiddle