2016-10-28 6 views
4

У меня есть определенный нокаут наблюдаемый, который используется во многих вычислительных функциях, и он работает точно так, как предполагается. Однако по одной из этих вычисляемых функций я НЕ хочу, чтобы она срабатывала при обновлении наблюдаемого. Код мудрое это будет выглядеть примерно так:Как обновить наблюдаемое в вычисляемом без запуска вычисляемого?

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 в trigger comp2, чтобы иметь новое значение.

Возможно ли это?

+0

Тьфу, я не знаю, если это возможно, но это, вероятно, с каким-то пользовательским удлинителем или что-то. Я думаю, что это признак того, что что-то не так, и прежде чем вы это сделаете, пересмотрите _why_ вы хотите этого и если вы не пытаетесь решить проблему [XY] (http: // meta .stackexchange.com/вопросы/66377/что-это-The-ху-проблема). – vlaz

+0

Спасибо @vlaz. Вероятно, вы правы, я просто не хотел слишком увязываться с контекстом. Короче говоря, это в основном то, что мой пользовательский интерфейс освежает слишком много, но я не могу просто использовать rateLimit, так как я хочу видеть обновления «obs1» почти сразу, но «obs2», который очень часто обновляется, мне никогда неинтересно. – Nathan

+0

Вы рассматривали использование '.extend ({throttle:/* некоторое разумное значение * /})' на втором наблюдаемом, тогда? – vlaz

ответ

2

Чтобы сделать его игнорировать обновления наблюдаемым, используйте peek (docs):

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); 

https://jsfiddle.net/r73yLk5u/2/

0

Итак, я понял, как это сделать. Если вы создаете новую, вычисленную, которая возвращает только наблюдаемую, которую вы хотите задержать, то rateLimit ее до такой степени, что она никогда не ударит, вы можете просто использовать это, вычисляемое вместо наблюдаемого. Это также позволит всегда использовать обновленное значение obs2, если вычисленный запрос запускается по любой другой причине в будущем.

self.obs2DelayComp = ko.computed(function() { 
    return self.obs2(); 
    }).extend({ rateLimit: 3001 }); 

https://jsfiddle.net/r73yLk5u/1/