【问题标题】:Knockout calls subscribe function before rendering the viewKnockout 在渲染视图之前调用 subscribe 函数
【发布时间】:2018-11-15 05:13:57
【问题描述】:

当与arrayChange 参数一起使用时,即使没有beforechange 属性,Knockout 也会在渲染视图之前调用订阅函数。

我创建了 JSfiddle,因为 StackOverflow 忽略了 JavaScript 代码中的 debugger; 关键字,这是查看此行为的最简单方法。 JSfiddle

有什么方法可以在渲染后通知 KnockOut 调用订阅函数?

我需要通过 subscribe 执行此操作,它由自定义绑定使用,不能被 afterRender 或类似的视图处理函数调用。

【问题讨论】:

  • 我无法重现您所描述的行为。运行小提琴时,不会记录任何内容。按“PUSH”时,控制台首先记录SUBSCRIBE,然后记录PUSH(如您所料)。
  • 请使用Chrome浏览器或其他支持debugger;关键字的浏览器。当按下“PUSH”时,调试器保持在打印“SUBSCRIBE”的订阅步骤,但items 元素尚未呈现。

标签: knockout.js knockout-2.0 knockout-3.0


【解决方案1】:

您可以在视图模型上公开一个方法来创建订阅,然后在调用 ko.applyBindings 后在 vm 上调用它:

function ViewModel(){
    var self = this;

    this.items = ko.observableArray([]);
    this.push = function(){
      self.items.push((Math.random(10)*10).toFixed(0));
      console.log("PUSH");
    }

    this.subscribeAfterApply = function(){
      this.items.subscribe(changes=>{
        console.log("SUBSCRIPTION FIRED");
      }, null, "arrayChange");
      console.log("SUBSCRIBED");
    }
}

var vm = new ViewModel();

ko.applyBindings(vm);
vm.subscribeAfterApply();

【讨论】:

  • 嗨,这实际上并不能解决我的问题,因为我需要在全局使用的自定义绑定中调用它。但它给了我思考的方向,所以非常感谢!
猜你喜欢
  • 2013-04-16
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2016-11-13
相关资源
最近更新 更多