このトピックに関するthis questionとthis other oneを見てきましたが、どれも私の問題を解決していないようです。
テーブルの各行内の要素の javascript プラグイン (BootStrap javascript ツールチップ) を初期化しようとしています。
そのためには、テーブルを DOM でレンダリングする必要があります。そして、そこが問題です。私の知る限り、knockout.js は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
します。これは、プラグインを最後に 1 回だけではなく、反復ごとに初期化する必要があるためです。
私が見つけた唯一の解決策はsetTimeout
、ツールチップ プラグインを適用する前に , を適用することでしたが、理想とはほど遠いものです。
ko.bindingHandlers.doSomething = {
update: function (element) {
console.log("table loaded???");
setTimeout(function(){
//applying the tooltip
$('.actions').tooltip({
title: 'Actions'
});
}, 2000);
}
};
tooltip
もう 1 つの解決策は、API からデータを取得した後にプラグインを呼び出すことでした。
//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);
};
それに対するより良いアプローチはありますか?