Ответ 1
Я согласен с @Jeroen, и я хотел бы добавить короткий пример из книги Дж. Мунро, которая очень помогла мне, поэтому это может быть полезно и для других.
Прежде всего, pureComputed наблюдаемые аналогичны вычислениям с несколькими улучшениями производительности и памяти. Имя заимствовано из термина программирования функции Pure, и это означает, что любая функция, которая использует только локальную переменную, потенциально чиста, тогда как любая функция, использующая нелокальную переменную, потенциально нечиста.
Наблюдаемые в Knockout.js трактуются по-разному. Таким образом, pureComputed наблюдаемые помещаются в спящий режим (нокаут склоняет все зависимости и повторно оценивает содержимое, когда после чтения), а вычисленные наблюдаемые помещаются в режим прослушивания (нокаут постоянно проверяет, соответствует ли значение первому до первого доступа),
Поэтому, если вам нужно выполнить другой код, лучше использовать вычисляемые наблюдаемые.
function ViewModel() {
var self = this;
self.firstName = ko.observable('Arshile');
self.lastName = ko.observable('Gorky');
self.pureComputedExecutions = 0;
self.computedExecutions = 0;
self.pureComputedFullName = ko.pureComputed(function() {
// This is NOT recommended
self.pureComputedExecutions++;
return 'Hello ' + self.firstName() + ' ' + self.lastName();
});
self.computedFullName = ko.computed(function() {
self.computedExecutions++;
return 'Hello ' + self.firstName() + ' ' + self.lastName();
});
};
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
alert('Pure computed executions: ' + viewModel.pureComputedExecutions);
alert('Computed executions: ' + viewModel.computedExecutions);
Когда этот код запущен, отображаются два предупреждающих сообщения, которые показывают количество раз, когда вызываются функции pureComputed и вычисляемые функции. Поскольку pureComputed находится в спящем режиме, функция никогда не была доступна, а счетчик wil отображает 0. В отличие от этого, вычисленная функция автоматически оценивается по привязке данных, заставляя счетчик увеличивать число и отображать 1.