2014-10-16 89 views
0

我想了解更多關於我遇到的其中一個鏈接中的智能髒標籤實施的信息。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不是可觀察的,則執行失敗。

以這種方式構建代碼的實際原因的簡短說明就是我真正想知道的。

回答

0

使對象成爲一個函數,並將計算出的observable添加到函數對象中。這意味着你必須將它綁定爲dirtyFlag.isDirty()。當ko.toJS運行時,它只會看到一個普通的函數並忽略它。

這實際上是什麼意思?

  • 這意味着通過使它成爲一個函數,它不會包含在我們將發送到服務器的信息中。這將幫助我們不向服務器發送大量不必要的數據,因爲服務器可能不關心IsDirty的東西。它與JS的相同方式忽略了所有與觀察相關的信息,只是給你一個對象的簡單副本。

    _initialState = ko.observable(ko.toJSON(root));

ko.dirtyFlag中的這個語句是否也會重新評估對象的創建者中的所有可觀察對象,即Item?

  • 不,它只會對實際屬性/對象(在本例中爲ITEM)執行此操作。我知道名稱參數「根」是混亂,但它並不是整個ViewModel。

另外什麼是真正的需要_initialState是一個可觀察?

  • 如果您看到實際印記,isDirty標誌是基於initialState的計算商品。

    result.isDirty = ko.computed(函數(){ 返回_isInitiallyDirty()|| _initialState()== ko.toJSON(根);! });

    如果它不是可觀察的,每次對象改變時都不會評估isDirty。

希望這是有道理的。

+0

非常精確和合理的原因。謝謝奎師那。 – 2014-10-16 23:09:00