【发布时间】:2013-12-04 02:11:42
【问题描述】:
刚刚发现,在 KnockoutJS 中,订阅函数是在依赖可计算之前评估的,并且需要有人可以提交,因为我在文档或论坛中找不到任何关于 Knockouts 时间的信息。
这意味着:如果我有这样的模型......
var itemModel = function (i) {
var self = this;
self.Id = ko.observable(i.Id);
self.Title = ko.observable(i.Title);
self.State = ko.observable(i.State);
};
var appModel = function () {
var self = this;
self.Items = ko.observableArray() // <-- some code initializes an Array of itemModels here
self.indexOfSelectedItem = ko.observable();
self.selectedItem = ko.computed(function () {
if (self.indexOfSelectedItem() === undefined) {
return null;
}
return self.Items()[self.indexOfSelectedItem()];
});
};
我想用一个可观察的索引字段来跟踪选定的数组项,我像这样订阅这个索引字段...
appModel.indexOfSelectedItem.subscribe(function () {
// Do something with appModel.selectedItem()
alert(ko.toJSON(appModel.selectedItem()));
}
...在使用新的索引值重新评估计算之前评估订阅函数,因此我将获得对应于最后选择的索引而不是实际选择的索引的 selectedItem()。
两个问题:
- 是这样吗?
- 那么,如果一个简单的函数每次调用它时都能让我获得当前选定的项目,而 ko.computed 会在一切都已经完成并且我不再需要它的任何时候进行评估,那我为什么要使用 ko.computed() ?
【问题讨论】:
-
为什么不订阅 selectedItem?所以
appModel.selectedItem.subscribe(function () {在这种情况下,当selectedItem发生变化时,您的函数将被调用。顺便说一句,您的计算中有一个错误:return self.Items[self.indexOfSelectedItem()];应该是return self.Items()[self.indexOfSelectedItem()];注意额外的() -
因为不仅有一个计算依赖于索引,还有更多。我需要一个处理程序,我可以在其中更新 UI 中的很多内容,并且所有这些计算字段也已经更新。我现在应该订阅哪一个?我认为计算对象就像一个 getter 函数,当我调用它时会对其进行评估。事实上,有一段时间,这些值绑定到旧值,所以我认为最好使用简单的 getter 函数,不是吗?谢谢你对额外的()是正确的......