【发布时间】:2013-04-07 17:42:53
【问题描述】:
我正在尝试使用 knockoutjs 将可观察的人员数组绑定到两列响应式布局与点击事件。
我创建了一个名为 TwoCol 的自定义绑定,它循环遍历数组,并将节点附加到 DOM 以创建我建议的布局,但是当我尝试将它们应用于嵌套在一个自定义绑定中时,单击事件给我带来了麻烦循环。
我玩过很多次,遇到了各种类型的结果,但我现在是在绑定期间调用我的 ~click~ 事件,而不是在点击时。
HTML:
<div data-bind="TwoCol: Friends" id="" style="padding: 20px">
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);
【问题讨论】:
-
小提琴中的代码与您在此处的代码不匹配,并且有几个语法错误
-
好的,我现在点击更新(并附加 /6/),再试一次?