jquery数据表的自定义ko绑定
custom ko binding for jquery data tables
我在knockout.js中使用了jquery dataTable。因为我从带有remove链接的函数生成数据行。它将删除表中的行以及可观察数组中的行。删除链接工作一次,并从表中删除行,但当我试图删除另一行时,他们不会删除它。
在这里你可以查看http://jsfiddle.net/zongweil/PLUKv/1/
$(document).ready(function () {
/* Custom binding */
ko.bindingHandlers.dataTable = {
init: function (element, valueAccessor) {
var binding = ko.utils.unwrapObservable(valueAccessor());
// If the binding is an object with an options field,
// initialise the dataTable with those options.
if (binding.options) {
$(element).dataTable(binding.options);
}
},
update: function (element, valueAccessor) {
var binding = ko.utils.unwrapObservable(valueAccessor());
// If the binding isn't an object, turn it into one.
if (!binding.data) {
binding = {
data: valueAccessor()
};
}
// Clear table
$(element).dataTable().fnClearTable();
// Rebuild table from data source specified in binding
$(element).dataTable().fnAddData(binding.data());
}
};
/* Object code */
function GroupMember(id, name, isGroupLeader) {
var self = this;
self.id = id;
self.name = name;
self.isGroupLeader = ko.observable(isGroupLeader);
self.link = ko.computed(function () {
return "/#user/" + self.id;
});
self.nameWithLink = ko.computed(function () {
return '<a href="' + self.link() + '">' + self.name + '</a>';
});
self.actions = ko.computed(function () {
return '<a class="btn btn-danger" data-bind="click: function() {removeMember(' + self.id + ')}">' + '<i class="icon-minus-sign"></i>' + '</a>';
});
}
/* View model */
var groupViewModel = {
groupMembers: ko.observableArray([
new GroupMember("1", "Abe", true),
new GroupMember("2", "Bob", false),
new GroupMember("3", "Bill", false)])
};
groupViewModel.membersTable = ko.computed(function () {
var self = this;
var final_array = new Array();
for (var i = 0; i < self.groupMembers().length; i++) {
var row_array = new Array();
row_array[0] = self.groupMembers()[i].nameWithLink();
row_array[1] = self.groupMembers()[i].actions();
final_array.push(row_array);
}
return final_array;
}, groupViewModel);
groupViewModel.removeMember = function (id) {
var self = this;
self.groupMembers.remove(function (groupMember) {
return groupMember.id == id;
});
};
ko.applyBindings(groupViewModel);
});
当您在自定义绑定的update
函数中调用fnClearTable
时,您可以在knockout后面清除DOM的一部分。
然后通过调用fnAddData
添加新的DOM元素。
您的按钮使用click
绑定工作。为了使click
结合起作用,敲除必须是applyBindings
。
如果您想继续使用dataTable
和click
绑定来处理DOM,那么每次进行更改时都必须手动应用绑定。在init
方法中,让knockout知道您正在处理后代绑定:
return { controlsDescendantBindings: true };
在update
方法中,手动应用绑定:
ko.applyBindingsToDescendants(viewModel, element);
这样可以确保click
绑定将再次工作。
以下是添加了此代码的示例:http://jsfiddle.net/5t15rhyq/
相关文章:
- jquery数据表的自定义ko绑定
- 淘汰赛JS;绑定值未更新或 ko.computed() 未更新
- KO 绑定复选框:从代码更改“选中”属性,不更改可观察字段
- 将 d3 演示中的圆圈和文本替换为包含自定义 HTML 和 ko 绑定的 foreignObject
- 防止拖动上的ko点击绑定
- 如何刷新'选项'ko多选组件中的绑定
- foreach:绑定不起作用 ko.mapping.fromJS 数据
- 将 TreeView 子项绑定到 ko.observables
- Knockout JS值不显示/绑定/更新,但可通过ko.toJS($data).value获得
- 如何使用 cookie 数组中的项目填充 KO 绑定列表
- 无法处理绑定,请使用 ko.mapping.fromJS 将 JSON 数据推送到 ObservableArray
- 防止 KO 绑定处理程序在页面加载时触发
- KO - 因为每个绑定似乎没有绑定,但我无法解决
- 分组结果为 KO.js foreach 绑定
- KO选项绑定在页面重新加载时将值保存为默认值
- 为什么我的 ko 计算的可观察量在其值更改时不更新绑定的 UI 元素
- 如何正确应用KO绑定以下示例
- 为剑道调度程序更新/重新分配创建KO绑定处理程序
- 如何延迟KO绑定,直到外部模板加载
- KnockoutJS-为输入类型无线电编写KO绑定句柄的正确方法