我已经看到了这个问题和关于这个主题的另一个问题,但它们似乎都没有解决我的问题。
我正在尝试为表的每一行中的元素初始化一个 javascript 插件(BootStrap javascript 工具提示)。
为此,表格必须在 DOM 中呈现。这就是问题所在。据我所知,knockout.js 没有提供正确的方法来知道 a 何时foreach
渲染了整个表格。
我试图通过应用我发布的第一个链接中提供的解决方案来解决它,即通过创建自定义绑定,但这在我的情况下不起作用。我猜是因为数据是通过从 AJAX 调用调用 API 来显示的。
ko.bindingHandlers.doSomething = {
update: function (element) {
console.log("table loaded???");
//applying the tooltip
$('.actions').tooltip({
title: 'Actions'
});
}
};
function ViewModel(){
var self = this;
self.myItems= ko.observableArray(['A', 'B', 'C']);
//emulating the delay of calling an external API
self.getdata = function(){
setTimeout(function(){
self.myItems.push('D');
self.myItems.push('E');
self.myItems.push('F');
}, 200);
};
self.addItem = function () {
this.myItems.push('New item');
};
//getting the data on loading
self.getdata();
}
ko.applyBindings(new ViewModel());
我不希望在案例中使用afterRender
Knockout.js 提供的回调,foreach
因为这样插件必须在每次迭代时初始化,而不是最后一次。
我找到的唯一解决方案是setTimeout
在应用工具提示插件之前应用 , ,但这远非理想:
ko.bindingHandlers.doSomething = {
update: function (element) {
console.log("table loaded???");
setTimeout(function(){
//applying the tooltip
$('.actions').tooltip({
title: 'Actions'
});
}, 2000);
}
};
另一种解决方案是在从 API 获取数据后调用tooltip
插件:
//emulating the delay of calling an external API
self.getdata = function(){
setTimeout(function(){
//simulating
$.get(url, function(data){
self.orders(data);
self.loading(false);
$('.actions').tooltip({
title: 'Actions'
});
});
}, 200);
};
有没有更好的方法呢?