1

有什么办法可以在knockoutjs中将以下两种方法合二为一吗?代码所说的是“如果勾选了 collectall 复选框,则禁用文本框并清除它”。

self.CollectAll.subscribe(function(CollectAll) {
    if (CollectAll) {
         self.TonalitySize('');
    }
});
self.DisableSizeLimit = ko.computed(function (){
    return self.CollectAll();
});
4

3 回答 3

3

如果DisableSizeLimitCollectAll总是等价的,那么你不需要额外的 observable。

self.CollectAll = ko.observable();
self.TonalitySize = ko.observable();

self.CollectAll.subscribe(function(CollectAll) {
    if (CollectAll) {
         self.TonalitySize('');
    }
});

您可以绑定CollectAll以禁用文本框。

<input data-bind="value: TonalitySize, disable: CollectAll" />
于 2013-08-01T20:37:40.750 回答
0
// add a computed property for the value you want to display.
self.TonalitySizeDisplay = ko.computed({
    read: function () { return self.CollectAll() ? "" : self.TonalitySize(); },
    write: self.TonalitySize
});
self.DisableSizeLimit = ko.computed(self.CollectAll);


// bind to the display property
<textarea data-bind="value: TonalitySizeDisplay, enable: !DisableSizeLimit()" />
于 2013-08-01T18:29:19.157 回答
0

是的,只要坚持subscribein 的逻辑即可computed。每当有任何可观察到的变化时,都会重新运行计算,因此它将像subscribe遗嘱一样运行

self.DisableSizeLimit = ko.computed(function (){
    if(self.CollectAll())
        self.TonalitySize('');
    return self.CollectAll();
});

我不确定您为什么要这样做。将它们分开会使行为更容易看到,在功能上是等效的,并且只是更好的做法。

于 2013-08-01T19:59:12.940 回答