目前,我使用dom元素的jQuery数据来存储状态。
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可以用来存储绑定的每个实例的状态吗?
发布于 2012-05-15 09:56:40
将数据附加到元素很好,例如,Knockout在内部将此方法用于控制流绑定(if、with等)。
另一种方法是仅使用init
函数,并使用计算出的可观察值来处理更新。我在repeat绑定中使用此方法。以下是重要的部分:
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});
...
}
};
发布于 2015-10-24 08:00:10
我经常使用这个模式:
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();
}
};
});
发布于 2016-12-29 23:38:06
我意识到这个问题很古老,但我在寻找方法时跌跌撞撞,所以我想我应该加入一个更现代的ko方法。
您可以直接将属性添加到bindingContext.$data。我选择了一个恼人的变量名"___IsEditing",以避免潜在的冲突,但您应该明白了……
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
}
}
};
https://stackoverflow.com/questions/10166110
复制相似问题