我想了解更多关于我遇到的其中一个链接中的智能脏标签实施的信息。Knockout SmartTag实施细节
<ul data-bind="foreach: items">
<li data-bind="css: { dirty: dirtyFlag.isDirty }">
<span data-bind="text: id"></span>
<input data-bind="value: name" />
</li>
ko.dirtyFlag = function(root) {
var result = function() {}
var _initialState = ko.observable(ko.toJSON(root));
result.isDirty = ko.computed(function() {
return _initialState() !== ko.toJSON(root);
});
return result;
};
function Item(id, name) {
this.id = ko.observable(id);
this.name = ko.observable(name);
this.dirtyFlag = new ko.dirtyFlag(this);
}
var ViewModel = function(items) {
this.items = ko.observableArray([
new Item(1, "one"),
new Item(2, "two"),
new Item(3, "three")
]);
this.save = function() {
alert("Sending changes to server: " + ko.toJSON(this.dirtyItems));
};
this.dirtyItems = ko.computed(function() {
return ko.utils.arrayFilter(this.items(), function(item) {
return item.dirtyFlag.isDirty();
});
}, this);
this.isDirty = ko.computed(function() {
return this.dirtyItems().length > 0;
}, this);
};
ko.applyBindings(new ViewModel());
我做原来的post
一些变化这是我的新fiddle 我想更多地了解原因,创建一个单独的函数对象ko.dirtyFlag 。 博客文章说
使对象成为一个函数,并将计算出的observable添加到函数对象。这意味着你必须将它绑定为dirtyFlag.isDirty()。当ko.toJS运行时,它只会看到一个普通的函数并忽略它。
这实际上是什么意思?
_initialState = ko.observable(ko.toJSON(root))
ko.dirtyFlag中的这个语句是否也重新评估了对象创建者中的所有观察值,即Item?
另外什么是_initialState是一个可观察的真正的需要?
_initialState = ko.observable(ko.toJSON(root))
如果_initialState不是可观察的,则执行失败。
以这种方式构建代码的实际原因的简短说明就是我真正想知道的。
非常精确和合理的原因。谢谢奎师那。 – 2014-10-16 23:09:00