Подтвердить что ты не робот

Нокаут: вычисленная наблюдаемая функция vs

При использовании нокаута в чем преимущество использования вычисляемых наблюдаемых данных, а не простых функций?

Возьмите следующий конструктор viewmodel и html-фрагмент, например:

var ViewModel = function(){
    var self = this;
    self.someProperty = ko.observable("abc");
    self.anotherProperty = ko.observable("xyz");
    self.someComputedProperty = function(){
        return self.someProperty() + self.anotherProperty();
    };    
};

<input data-bind="value: someProperty"/>
<input data-bind="value: anotherProperty"/>
<p data-bind="text: someComputedProperty()"></p>

Все здесь, похоже, работает так, как вы ожидали, поэтому есть причина, по которой я должен использовать:

​var ViewModel = function(){
    var self = this;
    self.someProperty = ko.observable("abc");
    self.anotherProperty = ko.observable("xyz");
    self.someComputedProperty = ko.computed(function(){
        return self.someProperty() + self.anotherProperty();
    });    
};


<input data-bind="value: someProperty"/>
<input data-bind="value: anotherProperty"/>
<p data-bind="text: someComputedProperty"></p>

Я заметил, что в документации http://knockoutjs.com/documentation/computedObservables.html указано, что "... декларативные привязки просто реализуются как вычисленные наблюдаемые", что мне нужно использовать их явно в моих моделях?

4b9b3361

Ответ 1

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

Вот несколько вещей, которые следует учитывать в отношении вычисляемых наблюдаемых по сравнению с функцией

  • значение вычисленного наблюдаемого кэшируется, поэтому оно обновляется только после его создания и при обновлении зависимостей. Для регулярной функции вам нужно будет выполнять логику каждый раз. Если многие вещи зависят от этого значения (скажем, каждый элемент в коллекции привязывается к значению от родителя), тогда эта логика будет запускаться снова и снова.

  • в вашем JavaScript, вы также можете использовать вычисляемые наблюдаемые данные, как и другие наблюдаемые. Это означает, что вы можете создавать ручные подписки на них и зависеть от них от других вычислений (вызов функции также создавал бы эту зависимость). Вы можете полагаться на обычные методы утилиты в KO, например ko.utils.unwrapObservable, чтобы в общем случае определить, нужно ли вам называть это как функцию или не извлекать значение.

  • если в конечном итоге вы хотите отправить значение на сервер, вычисленный наблюдаемый будет естественно появляться на вашем выходе JSON, а значение, являющееся результатом нормальной функции, просто исчезнет при преобразовании в JSON (вы должны сделать больше работы, чтобы сначала заполнить свойство из этой функции).