【问题标题】:knockout.js subscribe is not getting called on the first setknockout.js 订阅在第一组没有被调用
【发布时间】:2014-01-19 14:24:59
【问题描述】:

我有一个带有可观察对象的简单模型类。我只是想订阅它的集合。这是我的代码:

var dto = function (data) {
    var self = this;
    self.Value1 = ko.observable(data.Value1);
    self.Value1.subscribe(function(){
         console.log('here');
    });   
};

首次设置 Value1 时不会调用 console.log(即 ko.observable(data.Value1)

如何设置订阅功能在初始和更改时发生。

【问题讨论】:

    标签: javascript knockout.js knockout-3.0


    【解决方案1】:

    对于触发初始值的subscribe 函数没有真正的支持。

    你可以做的是在你的subscribe之后调用valueHasMutated函数:

    self.Value1.subscribe(function(){
         console.log('here');
    }); 
    self.Value1.valueHasMutated();
    

    或者您可以在订阅后设置初始值:

    var dto = function (data) {
        var self = this;
        self.Value1 = ko.observable(); // only declare but not assign
        self.Value1.subscribe(function(){
             console.log('here');
        });   
        self.Value1(data.Value1); // assign initial value
    };
    

    【讨论】:

      【解决方案2】:

      改进一下理查德的回答。如果这是一种反复出现的情况,您不知道 observable 是否已经获得了一个值,但您想调用订阅者(如果有),那么您可以使用此函数扩展 KO 订阅,该函数与原始签名具有相同的签名订阅:

      ko.subscribable.fn.subscribeAndCall = function(subscribingFunction, context, event) {
        var subscribableValue = this();
      
        this.subscribe(subscribingFunction, context, event);
      
        if (subscribableValue !== undefined) {
          subscribingFunction.call(context, subscribableValue);
        }
      };
      

      它也适用于虚假的初始值,不会意外触发 observable 的任何其他订阅者。

      原始问题的示例用法:

      self.Value1.subscribeAndCall(function(){
           console.log('here');
      }, this);
      

      【讨论】:

        【解决方案3】:

        我认为subsribe function 不适合那样工作。换句话说,当您的observable 对象发生变化时,您可以在执行某些回调/逻辑时使用它。

        来自@RP Niemeyer answer here

        要通知订阅者他们应该重新评估,您可以在可观察对象上使用valueHasMutated()

        【讨论】:

          【解决方案4】:

          我只是写这个供我自己使用:

          koSubscribe = function(observable, callback){
              observable.subscribe( callback );
          
              if (observable()) {
                  observable.valueHasMutated();
              }
          }
          

          它基于此处的其他答案。但是解决了“如果还没有设置怎么办?”的问题。 所以只要 observable 存在,这应该可以工作。

          用法:koSubscribe(value1, function() {…}); 其中 value1 是 ko.observable

          【讨论】:

            猜你喜欢
            • 2017-12-19
            • 1970-01-01
            • 2018-09-19
            • 2022-01-21
            • 1970-01-01
            • 2018-10-01
            • 2017-06-02
            • 2012-12-13
            • 2021-10-04
            相关资源
            最近更新 更多