[英]Using Knockout with Datatables Ajax source
我有一個這樣的數據表,並希望使我的數據表行具有可觀察到的剔除屬性。 能夠進行數據綁定的最佳方法是:“單擊”數據表中的一行。 我見過一個數據表敲除綁定,但它似乎不支持Ajax源。 我嘗試過使用foreach和模板綁定創建表並讓數據表從DOM初始化它的任何想法,但是它刪除了我擁有的綁定,因此當我單擊現在它不會執行任何操作。 似乎也很慢。 我想使用AJAX或JS Array。
{
"bDeferRender" : true,
"bProcessing" : true,
"sDom": '<"top"r>t<"bottom"lp><"clear">',
"oLanguage" : {
"sLoadingRecords" : " ",
"sProcessing" : processDialog
},
"sAjaxSource":'/get_statistics',
"sAjaxDataProp": 'landing_page_statistics',
"fnServerParams": function (aoData) {
aoData.push({"name": "start_date", "value": startDateEl.val()});
aoData.push({"name": "end_date", "value": endDateEl.val()});
},
"aoColumns" : [
{"mData" : "status", "sWidth": "6%"},
{"mData" : "name"},
{"mData" : "url"},
{"mData" : "pageViews", "sWidth": "15%"},
{"mData" : "leads", "sWidth": "5%"},
{"mData" : "convRate", "sWidth": "12%"}
],
"fnRowCallback": function (nRow, aData, iDisplayIndex) {
renderDataTableRow(nRow, aData, iDisplayIndex);
},
"fnFooterCallback" : function (nFoot, aData, iStart, iEnd, aiDisplay) {
renderDataTableTotalsRow(nFoot, aData, iStart, iEnd, aiDisplay);
},
"fnDrawCallback": function( oSettings ) {
// status tooltips
$('.lp-status').tooltip();
}
}
我不確定我是否能理解你的問題,如果我這樣做,我的回答就像是在作弊,只是指向相關資料。 無論如何,這是可行的。
您的第一個選擇是使用加載模型並將 AJAX數據手動保存到視圖模型中或從視圖模型中保存 。 相關教程在解釋事物方面做得相當不錯。 加載歸結為:
// Load initial state from server, convert it to Task instances, then populate self.tasks
$.getJSON("/tasks", function(allData) {
var mappedTasks = $.map(allData, function(item) { return new Task(item) });
self.tasks(mappedTasks);
});
將其保存到您的服務看起來像這樣:
self.save = function() {
$.ajax("/tasks", {
data: ko.toJSON({ tasks: self.tasks }),
type: "post", contentType: "application/json",
success: function(result) { alert(result) }
});
};
第二個相關選項是使用映射插件以基於約定的方式保存/加載ViewModel。 但是,您仍然需要一些布線才能與服務器通信。
對於View部分,在兩種情況下,我都認為您已經采用了正確的方法:在tbody
上使用foreach綁定 ,並為每個ViewModel構造一行。
同樣,這是一個相當模糊/廣泛的答案,部分原因是您的問題很廣泛。 希望能幫助到你。
這是做到這一點的方法...我制作了一個jsfiddle顯示如下:
為了使它起作用,我必須在原始的敲除foreach綁定定義中添加兩個回調方法。 我目前正在嘗試將這些事件納入最新版本的淘汰賽中。 我需要添加一個beforeRenderAll和afterRenderAll回調來銷毀數據表,並在敲除foreach綁定添加html之后重新初始化數據表。 這就像一個魅力。JSFiddle顯示了它具有一個完全可編輯的jquery數據表,該數據表通過剔除綁定到ViewModel。
使用Knockout,您將不會使用數據表的Ajax實現。 您將使用已定義html的標准實現。 讓Knockout通過ajax加載數據並將其分配給可觀察數組來處理html。 然后,下面的自定義foreach綁定將破壞數據表,讓敲除以默認的敲除foreach方式處理html,然后綁定將重新初始化數據表。
var viewmodel = new function(){
var self = this;
this.Objects = ko.mapping.fromJS([]);
this.GetObjects = function(){
$.get('your api url here', function(data){
ko.mapping.fromJS(
data,
{
key: function(o){ return ko.utils.unwrapObservable(o.Id); },
create: function(options){ return new YourObjectViewModel(options.data); }
},
that.Objects
);
});
};
};
//Or if you do not need to map to a viewmodel simply just...
$.get('your api url here', function(data){
viewmodel.Options(data);
});
下面是自定義數據表綁定...
ko.bindingHandlers.DataTablesForEach = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
return ko.bindingHandlers.foreach.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var value = ko.unwrap(valueAccessor()),
key = "DataTablesForEach_Initialized";
var newValue = function () {
return {
data: value.data || value,
beforeRenderAll: function(el, index, data){
if (ko.utils.domData.get(element, key)) {
$(element).closest('table').DataTable().destroy();
}
},
afterRenderAll: function (el, index, data) {
$(element).closest('table').DataTable(value.options);
}
};
};
ko.bindingHandlers.foreach.update(element, newValue, allBindingsAccessor, viewModel, bindingContext);
//if we have not previously marked this as initialized and there is currently items in the array, then cache on the element that it has been initialized
if (!ko.utils.domData.get(element, key) && (value.data || value.length)) {
ko.utils.domData.set(element, key, true);
}
return { controlsDescendantBindings: true };
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.