2014-10-16 5 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 , В блоге сообщается

, что делает объект функцией и добавляет вычисленные наблюдаемые объекту функции. Это означает, что вы должны привязать к нему как dirtyFlag.isDirty(). Когда ko.toJS запускается, он просто видит обычную функцию и игнорирует ее.

Что это значит?

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

ли это утверждение в ko.dirtyFlag также повторно оценить все наблюдаемые в создателю объекта, т.е. товара?

И какова реальная необходимость для _initialState быть наблюдаемым?

_initialState = ko.observable(ko.toJSON(root)) Выполнение не выполняется, если _initialState не является наблюдаемым.

Краткая заметка о фактической причине структурирования кода таким образом - это то, что я действительно хочу знать.

ответ

0

, что делает объект функцией и добавляет вычисленный наблюдаемый к объекту функции. Это означает, что вы должны привязать к нему как dirtyFlag.isDirty(). Когда ko.toJS запускается, он просто видит обычную функцию и игнорирует ее.

Что это значит?

  • Это означает, что, сделав это функцией, оно не будет включено в информацию, которую мы будем отправлять на сервер. Это поможет нам не отправлять много ненужных данных на сервер, так как серверу может не нравиться материал IsDirty. Его точно так же, какJS игнорирует всю информацию, связанную с наблюдаемыми, и дает вам простое копирование объекта.

    _initialState = ko.observable (ko.toJSON (корень));

ли это утверждение в ko.dirtyFlag также повторно оценить все наблюдаемые в создателю объекта, т.е. товара?

  • Нет, это будет делать это только на фактическом объекте/объекте, в данном случае - ITEM. Я знаю, что имя param «root» запутанно, но это не весь ViewModel.

И какова реальная необходимость для _initialState быть наблюдаемым?

  • Если вы видите фактическую импровизацию, флаг isDirty - это вычисленная проета на основе initialState.

    result.isDirty = ko.computed (функция() { возвращение _isInitiallyDirty() || _initialState() == ko.toJSON (корень)! });

    Если это не сделано видимым, isDirty не будет оцениваться каждый раз, когда объект изменяется.

Надеюсь, это имеет смысл.

+0

Очень точные и подходящие причины. Благодарю Кришну. –