【问题标题】:Bind two observables in knockout.js [closed]在 knockout.js 中绑定两个 observables [关闭]
【发布时间】: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


【解决方案1】:

你可以这样做:

vm1 = {
    val1: ko.observable('input1'),
    otherProperty: ko.observable('more')
}

vm2 = {
    val2: vm.val1,
    otherProperty: ko.observable('data')
}

vm1.val1vm2.val2 都解析为相同的 observable,因此具有相同的值。

【讨论】:

    【解决方案2】:

    Sethi 的答案会起作用,但computed observables 可能会更好

    示例:http://jsbin.com/exipuq/1/edit

    var viewModelA = function(){
      this.myVal = ko.observable();
    };
    
    var viewModelB = function(otherViewModel){
      this.compVal = ko.computed(function(){
        return otherViewModel.myVal(); 
      });
    };
    
    // create a new viewmodel like normal
    var vma = new viewModelA();
    
    // pass the instantiated view model 
    // into the new one you're creating    
    var vmb = new viewModelB(vma);
    

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2015-07-16
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多