2014-10-16 39 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