Как обновить наблюдаемое в вычисляемом без запуска вычисляемого?
У меня есть особая наблюдаемая нокаут, которая используется во многих вычисляемых функциях, и она работает точно так, как и должна. Однако для одной из этих вычисляемых функций я НЕ хочу, чтобы она запускалась при обновлении наблюдаемой. Код мудрый, это будет выглядеть примерно так:
self.obs1 = ko.observable(foo);
self.obs2 = ko.observable(bar);
//I want this computed to behave normally
this.comp1 = ko.computed(function() {
return self.obs1() + self.obs2();
}, this);
//I want this computed to trigger on obs1 update but ignore updates to obs2
this.comp2 = ko.computed(function() {
return self.obs1() + self.obs2();
}, self);
setTimeout(function() {
self.obs1(20);
self.obs2(15);
}, 1000);
https://jsfiddle.net/r73yLk5u/
Обратите внимание, что мне все еще нужно иметь доступ к текущему значению obs2 при выполнении comp2, я просто не хочу, чтобы обновление obs2 вызывало comp2, чтобы иметь новое значение.
Это возможно?
2 ответа
Чтобы он игнорировал обновления наблюдаемого, используйте peek
( документы):
peek
Функция позволяет получить доступ к наблюдаемой или вычисляемой наблюдаемой без создания зависимости.
Обновленный пример:
//I want this computed to trigger on obs1 update but ignore updates to obs2
this.comp2 = ko.computed(function() {
return self.obs1() + self.obs2.peek();
}, self);
Хорошо, я понял, как это сделать. Если вы создаете новое вычисляемое значение, которое возвращает только наблюдаемое, которое вы хотите отложить, то RateLimit до такой степени, что оно никогда не попадет, вы можете просто использовать это вычисленное вместо наблюдаемого. Это также заставит его всегда использовать актуальное значение obs2, если вычисляемый вызов будет запущен по какой-либо другой причине в будущем.
self.obs2DelayComp = ko.computed(function() {
return self.obs2();
}).extend({ rateLimit: 3001 });