Какая разница между computed
и pureComputed
в KnockoutJS?
Можно ли безопасно использовать pureComputed
вместо computed
?
Какая разница между computed
и pureComputed
в KnockoutJS?
Можно ли безопасно использовать pureComputed
вместо computed
?
Я согласен с @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.
Вы можете безопасно заменить computed
на pureComputed
во многих случаях. Функция внутри вычисленного должна следовать этому:
1.Оценка вычисленного наблюдаемого не должна вызывать побочных эффектов.
2. Значение вычисленного наблюдаемого не должно меняться в зависимости от количества оценок или другой "скрытой" информации. Его значение должно основываться исключительно на значениях других наблюдаемых в приложении, которые для определения чистой функции считаются ее параметрами.
Итак, как правило, любое вычисляемое наблюдаемое, которое просто трансформирует некоторые регулярные свойства observable
, должно быть точным как pureComputed
, в противном случае придерживаться computed
.
В документации есть приличные объяснения того, когда/почему вы не должны использовать pureComputed
наблюдаемые. Вот соответствующий отрывок:
Вам не следует использовать чистую функцию для вычисленного наблюдаемого, предназначенную для выполнения действия при изменении его зависимостей.
Причина, по которой вы не должны использовать чистое вычисление, если у оценщика есть важные побочные эффекты, просто то, что оценщик не будет выполняться всякий раз, когда у вычисленного нет активных подписчиков (и, следовательно, спать). Если это важно для того, чтобы оценщик всегда запускался при изменении зависимостей, используйте вместо него регулярное вычисление.