javascript - 跳过第一个关于 knockout 自定义绑定(bind)的更新

标签 javascript knockout.js custom-binding

我正在创建一个名为“myhandler”的自定义绑定(bind)。 我在初始化阶段不需要任何东西,我不想第一次执行更新功能。 ko.bindingHandlers 的更新成员,如前所述 in the guide ,在绑定(bind)应用程序中执行一次,然后每当可观察到的关联更改时 - 我想跳过绑定(bind)应用程序执行,因为它没有意义,因为页面的其他部分还没有准备好。

在 observable 关联的 newID 中,传入 html 绑定(bind)如下,我在 View 模型中创建了一个标志成员,名称为 bInitExecution (newID.bInitExecution)。

 <div><input id="objID" name="objID" data-bind="value: newID, myhandler: newID" /></div>

如果处理程序应该在第一阶段执行操作,则该成员不是可观察的(但我也尝试过不做任何更改),它是一个 bool 值,在模型中它被固定为 true 或 false根据需要,是否也必须在第一次执行更新。

 newID = ko.observable();
 //.... some other data
 newID.bInitExecution = false

我希望如果 bInitExecution 为假,以下代码将跳过第一次执行,然后始终执行,而如果 bInitExecution 为真,则始终执行。

 ko.bindingHandlers.myhandler = {
      init: function init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
         //None needed here
      },
      update: function(element, valueAccessor, allBindings) {
         if (valueAccessor().bInitExecution===true) {
            //Do stuff
        }
        if (valueAccessor().bInitExecution===false) valueAccessor().bInitExecution=true;
     }
 };

结果是,在第一次执行后,bInitExecution 设置为 true 的 observables 总是由 myhandler 更新,而 bInitExecution 设置为 false 的,即使 valueAccessor().bInitExecution 在绑定(bind)期间发生变化,之前应用为 console.log在真正的分配显示之后,不执行任何东西,再也不会执行 myhandler.update - 正如 console.log 放在更新函数的头部显示的那样。

我不明白为什么,有人有什么想法吗?谢谢

最佳答案

在 ko bindingHandler 实现中,ko 包装了整个 updateko.dependentObservable 中发挥作用(又名 ko.computed )。这就是 ko 运行你的 update 的方式和原因。数据模型改变时的功能。

这意味着如果你没有使用 newID() 的值(如 ko.unwrap(valueAccessor())valueAccessor()() )在您的 update 中函数,最终 ko.dependentObservable包装器 不依赖于 newID 。因此 ko 不会在 newID 时再次运行它。变化。

我猜你没有使用 newID 的值在你的//Do stuff... .

更新

我错过了这部分。 连newID()//Do stuff 中访问, ko.computed wrapper 将永远没有机会再次运行。因为在它的第一次运行中,并没有访问newID,实际上没有ko.observable。在第一次运行时被访问,因此 ko 的自动跟踪系统没有跟踪依赖关系。

关于javascript - 跳过第一个关于 knockout 自定义绑定(bind)的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163283/

相关文章:

javascript - 不和谐.js v12 : How do I await for messages in a DM channel?

javascript - 使用 knockout 将对象添加到可观察数组

knockout.js - 让 Knockout 示例发挥作用

javascript - Knockoutjs 自定义绑定(bind)显示加载 gif

jquery - 管理 jQuery 自定义事件

javascript - 如何一个一个地切换每个 <li> ?

javascript - 修改 XMLHttpRequest 中的请求 header

javascript - 两个圆圈应该跟随光标——一大一小(有延迟)

javascript - 使通过 ko.mapping.fromJS 创建的可观察数组没有可观察元素