Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js 淘汰:如何将一个可观测数组订阅给另一个数组的给定属性?_Knockout.js_Match_Subscribe - Fatal编程技术网

Knockout.js 淘汰:如何将一个可观测数组订阅给另一个数组的给定属性?

Knockout.js 淘汰:如何将一个可观测数组订阅给另一个数组的给定属性?,knockout.js,match,subscribe,Knockout.js,Match,Subscribe,这是我的viewmodel,包含2个可观察阵列: }; 我需要的是。。。当ObserverArray“B”中“Name”属性的值发生变化时,它必须更新ObserverArray“A”的“Name”属性 事实上,我正在这样做: ko.utils.arrayForEach(self.B(), function (item) { for (var index = 0; index < self.A().length; index++) {

这是我的viewmodel,包含2个可观察阵列:


}; 我需要的是。。。当ObserverArray“B”中“Name”属性的值发生变化时,它必须更新ObserverArray“A”的“Name”属性

事实上,我正在这样做:

    ko.utils.arrayForEach(self.B(), function (item) {                
        for (var index = 0; index < self.A().length; index++) {
            if (self.A()[index].ID == item.ID)
                if (self.A()[index].Name !== item.Name)
                    self.A()[index].Name = item.Name ; 
        }
    }); 
ko.utils.arrayForEach(self.B(),函数(项){
对于(var index=0;index
我的问题是:有没有可能A订阅了B,这样当B中的“名称”发生变化时,A就会得到更新?最好的方法是什么?我必须用“ko.computed”来代替吗


感谢您的帮助

您可以为您的数据定义一个
可观测
变量,然后利用
计算可观测的计算器
使计算可观测函数跟踪其依赖关系,并且您将能够更新其他数组的可观测值

检查此示例:


您不会看到ArrayA和ArrayB的名称之间有任何差异,因为计算函数的依赖项一更新就会触发(加载页面时,您会感觉(A,B)的两个名称相同)。你可能想考虑只使用一个数组而不是两个数组,因为ID和名称是相同的,那么你就不再需要使用计算函数了!!p> 您可以为您的数据定义一个
可观测的
变量,然后利用
计算可观测的计算器
,这样计算可观测函数就可以跟踪其依赖关系,并且您将能够更新另一个数组的可观测值

检查此示例:


您不会看到ArrayA和ArrayB的名称之间有任何差异,因为计算函数的依赖项一更新就会触发(加载页面时,您会感觉(A,B)的两个名称相同)。你可能想考虑只使用一个数组而不是两个数组,因为ID和名称是相同的,那么你就不再需要使用计算函数了!!p> 马特,非常感谢你的帮助。事实上,当我使用唯一一个包含所有字段(Id、名称、描述)的数组时,我可以看到同步的值。。。但是,我有一个应用程序,其中数据来自数据库中的几个表,我必须这样做。我喜欢您使用Jquery中的$.map将每个项目数组映射到ItemViewModel中的方式。。。还有ko.utils.arrayFirst。干杯这个例子有用吗?它可以在JSFIDLE上工作,但在我的应用程序上下文中却没有。我是通过黑客完成的。。。我触发了一个点击jqueryui对话框,其中包含B.name。。。这会更新一个.name。不专业,但我不能只用击倒来完成。马特,非常感谢你的帮助。事实上,当我使用唯一一个包含所有字段(Id、名称、描述)的数组时,我可以看到同步的值。。。但是,我有一个应用程序,其中数据来自数据库中的几个表,我必须这样做。我喜欢您使用Jquery中的$.map将每个项目数组映射到ItemViewModel中的方式。。。还有ko.utils.arrayFirst。干杯这个例子有用吗?它可以在JSFIDLE上工作,但在我的应用程序上下文中却没有。我是通过黑客完成的。。。我触发了一个点击jqueryui对话框,其中包含B.name。。。这会更新一个.name。不专业,但我不能用击倒的方式。
    ko.utils.arrayForEach(self.B(), function (item) {                
        for (var index = 0; index < self.A().length; index++) {
            if (self.A()[index].ID == item.ID)
                if (self.A()[index].Name !== item.Name)
                    self.A()[index].Name = item.Name ; 
        }
    }); 
  var dataA = [{"ID": 1, "Name": "one"}, {"ID": 2, "Name": "two"}, {"ID": 3, "Name": "three"}];
  var dataB = [{"ID": 1, "Name": "one", "Description":"description of One"}, {"ID": 2, "Name": "twoB","Description":"description of two"}, {"ID": 3, "Name": "three","Description":"description of three"}];
  var AppViewModel = function(){
     var self = this;
     self.A = ko.observableArray([]);
     self.B = ko.observableArray([]);
        self.A($.map(dataA, function (item) {
            return new ItemViewModel (item,self);
      }));

      self.B($.map(dataB, function (item) {
        return new ItemViewModel (item,self);
      }));
    }

    var ItemViewModel = function(data,AppVM){
      var self = this;
      self.ID = ko.observable(data.ID);
      self.Name = ko.observable(data.Name);
      self.Description = ko.observable(data.Description);
      self.UpdateA = ko.computed(function () {
        ko.utils.arrayFirst(AppVM.A(), function (item) {
          item.ID() === self.ID() ? item.Name(self.Name()) :"";
        });   
      }, self);
    }
    var VM = new AppViewModel();
    ko.applyBindings(VM);