2015-10-16 93 views
1

我有一个observableArrayobservable properties。我想设置observableArray项目的状态,每当项目添加/项目的任何属性得到改变。Knockout observable array更改事件

function ViewModel() { 
this.myArray=ko.observableArray([]); 
} 
var viewModel = new ViewModel(); 
    $(function(){ 
     ko.applyBindings(viewModel); 
     viewModel.myArray.push({Value1:ko.observable("Test"),Value2:ko.observable("Test1"),Status:ko.observable('Added')}); 

}); 

每当observableArray项目将得到修改(From UI or from Code)我想fire change event与该项目。

例如: -从代码修改

viewModel.myArray()[0].Value1("newTest1"); // At this point i need change event with changed array item. 

请建议我如何才能做到这一点。您的努力将不胜感激。

+0

到observableArray(删除/添加)所做的更改将被告知不存在内部内容这里http://jsfiddle.net/LkqTU/27274/看样。 –

+0

如果此数组绑定了HTML,并且用户更改了UI的值,那么它将自动更新observableArray。我想将该项目的状态从“已添加”更改为已修改。有没有其他方法可以实现这一点? – Sunny

+0

是的,让我为你弄个小提琴。想法很简单,而是订阅observableArray尝试在子级别订阅(可观察)。 –

回答

0

正如上面的评论中提到的,你需要订阅observable而不是试图在observableArray上订阅(因为它只有在添加/删除某些内容时才会收到通知)。

视图模型:

function child(data) { 
    var self = this; 
    self.Value1 = ko.observable(data.Value1); 
    self.Value2 = ko.observable(data.Value2); 
    self.Status = ko.observable(data.Status); 
    ko.computed(function() { 
     self.Value1(); 
     self.Value2(); // subscribing multiple observables 
     if (!ko.computedContext.isInitial()) { //status remains intact initially(onLoad) 
      self.Status('Modified'); 
     } 
    }); 
} 

function ViewModel() { 
    var self = this; 
    self.myArray = ko.observableArray([]); 
} 
$(function() { 
    ko.applyBindings(new ViewModel()); 
}); 

工作样本高达here

你可以找到上面我使用computedContext与功能isInitial

isInitial() - 函数返回如果在第一个期间被调用,则为true曾经评估过的当前计算的可观测值,否则为假 。对于纯粹的计算观察值,isInitial()始终为 未定义。

计算文档here

0

您可以使用一些(专用)计算字段,您将遍历所有您需要的可观察属性。 当事情将在此计算后的变化,它会重新计算,你会得到一个通知

ko.computed(function(){ 
    viewModel.collection().forEach(function(element){ 
     var a = element.text(); 
    }); 
} 

在这个例子中,当一个数组被更改或任何元素的文本改变了整个计算被重新计算,并在这里你可以设置你需要的一些状态

+0

如果此数组绑定了HTML,并且用户更改了UI的值,那么它将自动更新observableArray。我想将该项目的状态从“已添加”更改为已修改。有没有其他方法可以实现这一点? – Sunny

+0

您可以使用observable.subscribe(例如文本。订阅)并在那里更新状态 – Andrey

+0

另一种方式 - 您可以使状态成为计算字段,该字段将比较当前值和初始值并返回相应的状态 – Andrey