【发布时间】:2012-09-27 09:18:16
【问题描述】:
我有两个简单的可观察对象,例如,
val1 = ko.observable("input1");
val2 = ko.observable("input2");
我希望它们表现得像一个,所以当其中一个发生变化时,另一个也会发生变化。
我知道通常情况下最好只使用一个 observable 并将其绑定到多个 dom 元素。但就我而言,这些可观察对象存在于不同的模板和对象中,因此它们不能是一个变量。
目前我将一个 observable 订阅到另一个 observable,反之亦然:
val1.subscribe(function(v) {
val2(v);
});
val2.subscribe(function(v) {
val1(v);
});
但是,当您更改一个 observable 的值时,它会更新第二个,但这会产生连锁反应并再次更新第一个,无止境。
如何在两个单独的 observable 之间设置双向绑定,当您修改另一个时设置一个的值而不导致无限循环?
【问题讨论】:
-
您确定不能使用一个属性吗?您能否提供更多关于您要完成的工作的详细信息?
-
手动订阅将是一个不错的选择。如果您正在寻找有助于解耦视图模型之间通信的解决方案,那么您可能会考虑类似:github.com/rniemeyer/knockout-postbox。这仅取决于您的情况。您可以做的另一件事就是在两个视图模型中引用相同的 observable。它们可以有不同的名称等,但它们会指向同一个 observable。
-
这个问题相当不错。我不明白那些人为什么关闭它。
-
这可能是一个有用的助手:
ko.subscribable['fn'].syncWith = function (targetObservable, callbackTarget, event) { var sourceObservable = this; sourceObservable.subscribe(function (v) { targetObservable(v); }, callbackTarget, event); targetObservable.subscribe(function (v) { sourceObservable(v); }, callbackTarget, event); return sourceObservable; }使用它:val1.syncWith(val2) -
我创建了一个在类似情况下对我有用的扩展器:
标签: binding knockout.js observable subscribe