Knockout.js 淘汰:如何将一个可观测数组订阅给另一个数组的给定属性?
这是我的viewmodel,包含2个可观察阵列: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++) {
}; 我需要的是。。。当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);