Нокаут: вычисляется функция наблюдаемых против
при использовании нокаута, в чем преимущество использования только для чтения вычисляемых наблюдаемых, а не простых функций?
Возьмите следующий конструктор 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 ответ:
Если единственная цель вашего вычисленного наблюдаемого-сделать простую привязку к нему, то использование функции будет эквивалентно. Привязки реализуются внутри вычисляемой наблюдаемой для отслеживания зависимостей,поэтому она будет повторно запускать привязку при изменении любой из наблюдаемых.
вот несколько вещей, чтобы рассмотреть о вычисленных наблюдаемых против функции
значение вычисленного наблюдаемого кэшируется, поэтому оно обновляется только тогда, когда оно создается и при обновлении зависимости. Для обычной функции вам нужно будет выполнять логику каждый раз. Если многие вещи зависят от этого значения (скажем, каждый элемент в коллекции привязывается к значению от родителя), то эта логика будет запускаться снова и снова.
в вашем JavaScript вы также можете использовать вычисляемые наблюдаемые, как и другие наблюдаемые. Это означает, что вы можете создавать подписки вручную против них и зависеть от них из других вычислений (вызов функции также создаст эту зависимость). Вы можете положиться на обычные методы утилиты в KO like
ko.utils.unwrapObservable
чтобы в общем случае определить, нужно ли вызывать его как функцию или не извлекать значение.если в конечном итоге вы хотите отправить значение на сервер, вычисленное наблюдаемое естественно появится в вашем выводе JSON, в то время как значение, являющееся результатом нормальной функции, просто исчезнет при преобразовании в JSON (вы бы сначала нужно сделать больше работы, чтобы заполнить свойство из этой функции).