首先跳过敲除自定义绑定的更新

时间:2014-08-06 14:39:05

标签: javascript knockout.js custom-binding

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

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

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

成员,如果处理程序应该在第一阶段执行操作,那么它不是可观察的(但我也试过这样做而没有任何改变),它是一个布尔值,在模型中它被修复为true或false如果需要,还必须在第一时间进行更新。

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

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

 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的observable总是由myhandler更新,而bInitExecution设置为false的observable设置为false,即使valueAccessor()。bInitExecution在绑定期间更改也应用为console.log之前并且在真正的赋值显示之后,不执行任何东西,再也不执行myhandler.update - 因为放在更新函数头部的console.log显示。

我不明白为什么,有人有任何想法?感谢

1 个答案:

答案 0 :(得分:2)

在ko bindingHandler实现中,ko将整个update函数包装在ko.dependentObservable(又名ko.computed)中。这就是ko在数据模型更改时运行update函数的方式和原因。

这意味着如果您未在newID()函数中使用ko.unwrap(valueAccessor())valueAccessor()()update)的值,则最终{{1} } wrapper 不依赖于ko.dependentObservable 。因此,当newID更改时,ko不会再次运行它。

我猜您没有在newID中使用newID的值。

<强>更新

我错过了这一部分。 即使在//Do stuff...中访问newID()//Do stuff包装也永远无法再次运行。因为在第一次运行时,不访问newID,实际上在第一次运行中没有访问ko.computed,因此ko的自动跟踪系统没有跟踪任何依赖性。