Javascript KnockoutJS自定义绑定在绑定期间调用click事件,而不是单击
我正在尝试使用knockoutjs将一组可观察的人物绑定到一个两列响应的布局中,其中包含点击事件 我创建了一个名为TwoCol的自定义绑定,它在数组中循环,并将节点附加到DOM以创建建议的布局,但是当我尝试在嵌套在循环中的自定义绑定中应用它们时,单击事件给我带来了麻烦 我已经玩了很多次了,遇到了各种类型的结果,但我现在要做的是在绑定期间调用~click~事件,而不是单击 HTML:Javascript KnockoutJS自定义绑定在绑定期间调用click事件,而不是单击,javascript,knockout.js,Javascript,Knockout.js,我正在尝试使用knockoutjs将一组可观察的人物绑定到一个两列响应的布局中,其中包含点击事件 我创建了一个名为TwoCol的自定义绑定,它在数组中循环,并将节点附加到DOM以创建建议的布局,但是当我尝试在嵌套在循环中的自定义绑定中应用它们时,单击事件给我带来了麻烦 我已经玩了很多次了,遇到了各种类型的结果,但我现在要做的是在绑定期间调用~click~事件,而不是单击 HTML: JAVASCRIPT: function FriendsModel() { var self =
JAVASCRIPT:
function FriendsModel() {
var self = this;
this.Friends = ko.observableArray();
this.SelectedFriend = "";
this.SetSelected = function (person) {
alert(person);
self.SelectedFriend = person;
}
}
function isOdd(num) {
return num % 2;
}
ko.bindingHandlers.TwoCol = {
update: function (elem, valueAccessor) {
var i = 0;
var rowDiv;
var vFriends = ko.utils.unwrapObservable(valueAccessor());
$(elem).html('');
while (i < vFriends.length) {
//create row container every other iteration
if (!isOdd(i)) {
rowDiv = document.createElement("div");
$(rowDiv).addClass("row-fluid");
elem.appendChild(rowDiv);
}
//add column for every iteration
var colDiv = document.createElement("div");
$(colDiv).addClass("span6");
rowDiv.appendChild(colDiv);
//actual code has fairly complex button html here
var htmlDiv = document.createElement("div");
var htmlButton = vFriends[i]
htmlDiv.innerHTML = htmlButton;
colDiv.appendChild(htmlDiv);
//i think i need to add the event to the template too?
//$(htmlDiv).attr("data-bind", "click: { alert: $data }")
//it seems that the SetSelected Method is called while looping
ko.applyBindingsToDescendants(htmlDiv, { click: friends.SetSelected(vFriends[i]) });
i++;
}
return { controlsDescendantBindings: true };
}
}
var friends = new FriendsModel();
friends.Friends.push('bob');
friends.Friends.push('rob');
friends.Friends.push('mob');
friends.Friends.push('lob');
ko.applyBindings(friends);
函数FriendsModel(){
var self=这个;
this.Friends=ko.array();
this.SelectedFriend=“”;
this.SetSelected=功能(个人){
警惕(人);
self.SelectedFriend=个人;
}
}
函数isOdd(num){
返回数值%2;
}
ko.bindingHandlers.TwoCol={
更新:函数(元素、值访问器){
var i=0;
var-rowDiv;
var vFriends=ko.utils.unwrapobbservable(valueAccessor());
$(elem.html(“”);
while(i
我认为您没有正确使用ko.applybindingstosubstands
。我承认我对代码中某些值的含义有点困惑,所以我可能对某些内容的解释不正确
这是一把小提琴,我认为它正按照你的意图工作:
请注意,如果手动控制子体绑定(返回{ControlsDescentBindings:true};
),则需要在init回调中进行设置,而不是更新。更新回调已经太晚了
更改的快速摘要(已编辑):
controlsDescentBindings
移动到init
绑定回调中$parent.SetSelected
$(htmlDiv).attr("data-bind", "click: $parent.SetSelected")
ko.applybindingstosubstands
调用。此方法获取从当前绑定上下文创建的绑定上下文,并获取应用绑定的元素。您不想重新应用绑定,这就是为什么整个绑定都需要在init处理程序中的原因
var childBindingContext = bindingContext.createChildContext(vFriends[i]);
ko.applyBindingsToDescendants(childBindingContext, colDiv);
我认为您没有正确使用
ko.applybindingstosubjects
。我承认我对代码中某些值的含义有点困惑,所以我可能对某些内容的解释不正确
这是一把小提琴,我认为它正按照你的意图工作:
请注意,如果手动控制子体绑定(返回{ControlsDescentBindings:true};
),则需要在init回调中进行设置,而不是更新。更新回调已经太晚了
更改的快速摘要(已编辑):
controlsDescentBindings
移动到init
绑定回调中$parent.SetSelected
$(htmlDiv).attr("data-bind", "click: $parent.SetSelected")
ko.applybindingstosubstands
调用。此方法获取从当前绑定上下文创建的绑定上下文,并获取应用绑定的元素。您不想重新应用绑定,这就是为什么整个绑定都需要在init处理程序中的原因
var childBindingContext = bindingContext.createChildContext(vFriends[i]);
ko.applyBindingsToDescendants(childBindingContext, colDiv);
fiddle中的代码与此处的代码不匹配,并且存在多个语法错误OK,我现在点击update(和追加的/6/),再试一次?fiddle中的代码与此处的代码不匹配,并且存在多个语法错误OK,我现在点击update(和追加的/6/),再试一次?谢谢!这很好,但是在我的生产场景中,所有的项目都是在初始绑定之后添加的,并且在推送它们时,它似乎没有调用init。你能帮我将代码在init和update之间进行拆分以适应这种情况吗?我“摆弄”了你的小提琴,但这只会让我头疼。我错认为应用程序绑定在init中。我会更新答案
ControlDegenantsBindings:true
不需要在init中。其他一切都在更新中。非常感谢。那工作