我想了解更多關於我遇到的其中一個鏈接中的智能髒標籤實施的信息。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