首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于自定义knockout绑定,在init和update之间存储状态的首选方法是什么?

对于自定义knockout绑定,在init和update之间存储状态的首选方法是什么?
EN

Stack Overflow用户
提问于 2012-04-16 05:07:55
回答 4查看 8.9K关注 0票数 57

目前,我使用dom元素的jQuery数据来存储状态。

代码语言:javascript
复制
ko.bindingHandlers.customValue = {

    init: function init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var state = { isEditing: false };        
        $(element).focus(function focus() {
            state.isEditing = true;
        }).blur(function blur() {
            state.isEditing = false;            
        }).data("customBinding", state);

    },

    update: function update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        // ignore if updating
        if (!$(element).data("customBinding").isEditing) {
            // handle update if they are not updating                                
        }
    }

};​

有没有更好的地方来存储每个不需要dom的绑定的状态?bindingContext可以用来存储绑定的每个实例的状态吗?

EN

回答 4

Stack Overflow用户

发布于 2012-05-15 09:56:40

将数据附加到元素很好,例如,Knockout在内部将此方法用于控制流绑定(if、with等)。

另一种方法是仅使用init函数,并使用计算出的可观察值来处理更新。我在repeat绑定中使用此方法。以下是重要的部分:

代码语言:javascript
复制
ko.bindingHandlers['repeat'] = {
    'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        ...
        // set up persistent data
        var lastRepeatCount = 0;
        ...
        ko.computed(function() {
            var repeatCount = ko.utils.unwrapObservable(valueAccessor());
            ...
            // Remove nodes from end if array is shorter
            for (; lastRepeatCount > repeatCount; lastRepeatCount--) {
                ...
            }
            ...
            // Add nodes to end if array is longer (also initially populates nodes)
            for (; lastRepeatCount < repeatCount; lastRepeatCount++) {
                ...
            }
        }, null, {'disposeWhenNodeIsRemoved': placeholder});
        ...
    }
};
票数 9
EN

Stack Overflow用户

发布于 2015-10-24 08:00:10

我经常使用这个模式:

代码语言:javascript
复制
define(['knockout'], function(ko) {
  var interInstanceVariable = null;

  function Tree(element) {
    var privateInstanceVariable = null;

    function privateInstanceMethod() {}

    this.publicInstanceMethod = function() {}
  }


  ko.bindingHandlers.cannDendrogram = {
    init: function(element, valueAccessor) {
      $(element).data('tree', new Tree(element));
    },
    update: function(element, valueAccessor) {
      var tree = $(element).data('tree');
      tree.publicMethod();
    }
  };
});
票数 2
EN

Stack Overflow用户

发布于 2016-12-29 23:38:06

我意识到这个问题很古老,但我在寻找方法时跌跌撞撞,所以我想我应该加入一个更现代的ko方法。

您可以直接将属性添加到bindingContext.$data。我选择了一个恼人的变量名"___IsEditing",以避免潜在的冲突,但您应该明白了……

代码语言:javascript
复制
ko.bindingHandlers.customValue = {

init: function init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    bindingContext.$data.___IsEditing = false;        
    $(element).focus(function focus() {
        bindingContext.$data.___IsEditing = true;
    }).blur(function blur() {
        bindingContext.$data.___IsEditing = false;            
    }).data("customBinding", state);

},

update: function update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    // ignore if updating
    if (bindingContext.$data.___IsEditing) {
        // handle update if they are not updating                                
    }
}

};​

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10166110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档