Вычислительная подписка на нокаут для необъявленной наблюдаемой

Есть ли способ вручную добавить или удалить подписку на расчетный нокаут? В сценарии, в котором я хочу добавить подписку к наблюдаемой, еще не объявленной, или как свойство, которое может измениться.

то есть:

self.myComputed = ko.computed(function() {
   return "Value Is: " + self.myObservable();
})

self.myObservable(1);
//self.myComputed returns "Value Is: 1"

тогда позже:

self.myObservable = ko.observable(2);  //new observable to property
//some code to add subscription to self.myComputed here
self.myObservable(3);
//self.myComputed returns "Value Is: 3" now

Я понимаю, что есть способы обойти эту проблему (например, просто повторно использовать self.myObservable для следующего значения), но иногда мне бы хотелось вручную поработать с подписками.

1 ответ

Я не могу понять, почему вы хотите это сделать, но вы можете создать вычисляемый объект, который ссылается на наблюдаемое по имени свойства, а не по значению.

self.myComputed = function () {
    return "Value is "+self["myObservable"]();
};
self.myObservable(1);
self.myComputed(); // Returns "Value is 1"

var oldMyObservable = self.myObservable;
self.myObservable = ko.observable(2);
self.myComputed(); // Returns "Value is 1", since the computed hasn't updated

oldMyObservable.notifySubscribers(); //force myComputed to recompute
self.myComputed(); // Returns "Value is 2"

Конечно, я думаю, что подход к наблюдаемой, содержащей наблюдаемое, более чистый; но я думал, что подход выше был достаточно интересным для публикации.

Другие вопросы по тегам