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


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

Возьмите следующий конструктор 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 утверждает, что "...декларативные привязки просто реализуются как вычисляемые наблюдаемые", так что это означает, что мне нужно использовать их явно в моих моделях просмотра?

1 53

1 ответ:

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

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

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

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

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