Knockout.js绑定范围

时间:2015-03-21 18:00:27

标签: javascript jquery knockout.js

在绑定处理程序的initupdate部分之间共享变量的最佳方法是什么?

ko.bindingHandlers.someBinding = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) 
    {
        // declare something here
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) 
    {
        // use the variable here
    }   
}

我确信我不想污染视图模型本身。 我可以通过jQuery.data()将它附加到元素上,但这感觉非常难看。

1 个答案:

答案 0 :(得分:4)

knockout.js中的自定义绑定仅创建一次,因此这意味着如果存储一些局部变量,它将被重用于使用绑定的每个元素。如果这不是你的问题,下面是如何实现这一目标的一种方法。

Knockout绑定要求您返回包含方法initupdate的对象。您可以使用示例中显示的对象文字,但可以使用其他模式,例如revealing module pattern

// instead of using object literal, use IIFE (immediately invoked function expression:
ko.bindingHandlers.someBinding = (function(){
     // define your local variables, functions and anything else you need
     // keep in mind that the same variables will be re-used for EVERY
     //element where the binding is used
     var yourVariable = 0,

         // declare init and update methods
         init = function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) 
         {
            alert(yourVariable);   // displays 0
            yourVariable += 1;
         },
         update = function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) 
         {
            alert(yourVariable);   // displays 1
         };
    // return object literal with methods init and update
    return {
        init: init,
        update: update
    };
}());    // execute the function