【问题标题】:Knockout Computed Subscription to undeclared observable对未声明的 observable 的淘汰计算订阅
【发布时间】:2014-05-29 06:28:51
【问题描述】:

有没有办法手动添加或删除对淘汰赛计算的订阅?在我想为尚未声明的可观察对象添加订阅或作为可能更改的属性的情况下。

即:

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 重用于下一个值),但我有时想手动修改订阅。

【问题讨论】:

  • 计算的 observable 的订阅在声明时注册到实际的 observable 对象,而不是视图模型上的属性名称 - 您只能更新订阅的 observable 的值以供计算选择它了。另一种方法是在对 observable 结构进行任何更改以生成对新 observable 的新订阅后重新创建计算。
  • 感谢您的回复!这是绝对正确的。在这种情况下,您还需要确保在创建新的之前手动处理计算。
  • 你可以使self.myObservable成为一个可观察的可观察的。所以你会做类似self.observable = ko.observable(ko.observable(1)); self.myComputed = ko.computed(function(){ return "value is: " + ko.unwrap(self.observable()); }); self.observable(ko.observable(3));的事情。在技​​术上工作;但是,我必须说我不确定我是否真的了解用例(但我不需要,只要你这样做:))。
  • 感谢您的回复!目前没有我要反对的用例,只是我过去想到的,我可能想创建一个对象并通过一系列输入移动它,然后最终以数组或一些东西,一个新对象的可重用“流”。但是,在最后创建新对象并重置可观察值同样容易。

标签: knockout.js subscriptions


【解决方案1】:

我真的不明白您为什么要这样做,但是您可以创建一个计算值,该计算值通过属性名称而不是值来引用 observable。

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"

当然,我认为包含 observable 的 observable 的方法更干净;但我认为上面的方法很有趣,可以发帖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2013-12-04
    • 1970-01-01
    • 2019-06-02
    • 2019-03-28
    相关资源
    最近更新 更多