私の問題は、スクリプトを追加$(ele).html('some html')
するのが早いか遅いかのどちらかであるため、スクリプトに追加する場所がないことです。これが私の実際の問題です:
最初に viemModel を作成します
var mainAdmin = function(){
var self = this;
self.pageLanguage = mainAdminDTLanguage;
self.tableData = ko.observableArray([]);
self.dataTable = ko.observable(null);
/*self.tableRowClick = function(data) {
var checkCode = confirm('Vai atzīmēt šo kuponu?');
if(checkCode){
alert(data[0]);
$.ajax({
url: '/api/code/mark/'+data[0],
type: 'GET',
success: function(data) {
console.log(data);
}
});
}
};*/
self.tableOptions = { aaSorting: [["1","desc"]] };
self.dtSelectValue = ko.observable('visus');
self.initLoad = function() {
$.ajax({
url: '/api/item/all',
dataType: 'json',
success: function(data) {
$.each(data, function(index) {
self.tableData.push([this.ID,this.Title, Dateformat('M jS, H:i:s',new Date(this.EndDate)),'<button>Dzēst</button>']);
console.log(this.ID);
});
console.log(data);
}
});
};
self.recentItemLoad = function() {
$.ajax({
url: '/api/item/inactive',
dataType: 'json',
success: function(data) {
self.tableData([]);
$.each(data, function(index) {
self.tableData.push([this.ID,this.Title, Dateformat('M jS, H:i:s',new Date(this.EndDate)),'<button>Dzēst</button>']);
console.log(this.ID);
});
console.log(data);
}
});
};
self.activeItemLoad = function() {
$.ajax({
url: '/api/item/active',
dataType: 'json',
success: function(data) {
self.tableData([]);
$.each(data, function(index) {
self.tableData.push([this.ID,this.Title, Dateformat('M jS, H:i:s',new Date(this.EndDate)),'<button>Dzēst</button>']);
console.log(this.ID);
});
console.log(data);
}
});
}
self.dtSelectValue.subscribe(function(newValue) {
(newValue == 'visus') ? mainViewModel.mainAdminPage.initLoad() : (newValue == 'aktīvos') ? mainViewModel.mainAdminPage.activeItemLoad() : (newValue == 'neaktīvos') ? mainViewModel.mainAdminPage.recentItemLoad() : false
});
};
はい、少し面倒なのはわかっていますが、実際にはまだ最適化する時間がありませんでした
次に、jQuery の DataTable バインディングを作成します
ko.bindingHandlers.dataTable = {
init: function(element, valueAccessor) {
var options = valueAccessor();
var defaults = {
"aaData": options["data"](),
"bRetrieve": true,
"oLanguage": options["language"],
"bJQueryUI": true,
"sDom": '<"H"l<"dt-toolbar">fr>t<"F"ip>',
"fnRowCallback": function(nRow, aData, iDisplayIndex) {
$(nRow).mouseover(function(){
$(nRow).attr("style","background-color:yellow !important;");
});
$(nRow).mouseout(function() {
$(nRow).removeAttr("style");
});
if(typeof options["rowClick"] === "function") {
$(nRow).click(function() {
options["rowClick"](aData);
});
}
return nRow;
},
};
var tableOptions = $.extend(defaults,options["options"]);
options["object"]($(element).dataTable(tableOptions));
$("div.dt-toolbar")
.html('Rādīt <select data-bind="value: $data.dtSelectValue"><option>visus</option><option>aktīvos</option><option>neaktīvos</option></select> kuponus');
},
update: function(element,valueAccessor) {
var options = valueAccessor();
options["object"]().fnClearTable();
options["object"]().fnAddData(options["data"](),true);
}
};
$("div.dt-toolbar")
.html('Rādīt <select data-bind="value: $data.dtSelectValue"><option>visus</option><option>aktīvos</option><option>neaktīvos</option></select> kuponus');
@ init
!を作成したことがわかります。
次に、mainViewModel を作成し、バインディングを適用します。
// --- mainView viewmodel
var mainViewModel = {
indexPage: new indexViewModel(),
itemPage: new itemViewModel(),
catPage: new categoryViewModel(),
companyPage: new companyAdmin(),
mainAdminPage: new mainAdmin()
};
// --Applied bindings
ko.applyBindings(mainViewModel);
バインディングを適用した後、基本的に次の順序で DataTable を作成していることがわかります。
- ビューモデル
- mainViewModel
- カスタムバインディング
- HTML を作成する
- applyBindings を html に
- でhtmlを作成します
data-bind
質問
- 無限ループにならずに、その正確な要素にバインドを適用するにはどうすればよいですか?