현재 녹아웃 용 Josh Buckley의 Datatables 바인딩을 사용하고 있습니다. 나는 데이터 테이블에 "행 삭제"버튼을 만들려고합니다. 현재 각 버튼에 클릭 데이터 바인딩이 있습니다. 데이터 테이블 소스는 관찰 가능한 배열에 연결됩니다. 사용자가 버튼을 클릭하면 관찰 가능 어레이에서 객체가 제거되고 업데이트 바인딩이 트리거되고 이후에 테이블 뷰가 업데이트됩니다. 적어도 버튼을 클릭 할 때마다 정상적으로 작동합니다.Knockout + Datatables - 셀의 바인딩 업데이트
그러나 테이블이 업데이트되면 "행 삭제"버튼의 모든 클릭 바인딩이 작동을 멈 춥니 다. 업데이트 바인딩이 호출 될 때마다 전체 테이블이 지워지고 다시 작성되므로 바인딩이 새 요소에 적용되지 않기 때문입니다.
각 데이터 테이블 업데이트로 생성 된 새 요소를 리 바인드하려면 어떻게해야합니까? 또는 이것을 처리하는 더 좋은 방법이 있습니까?
사용자 정의 바인딩 :
(function($){
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());
}
};
})(jQuery);
HTML 코드 :
<table id="membersTable" class="table table-striped table-bordered bootstrap-datatable datatable" data-bind="dataTable: membersTable">
<thead>
<tr>
<th>Name</th>
<th>Actions</th>
</tr>
</thead>
</table>
보기 모델 :
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;
});
};
그룹 회원 개체 :
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>';
});
}
편집 :
jsfiddle 링크 : http://jsfiddle.net/zongweil/PLUKv/1/
당신은 이것을 바이올린에 넣을 수 있습니까? 도움을 훨씬 쉽게 해줍니다. –
추가 : http://jsfiddle.net/zongweil/PLUKv/1/ – zongweil