モデルの各エントリでテーブルが更新され、配列の削除と追加時に2つのイベントが発生しました。hiddenElementはjqueryの「fadeOut」を呼び出し、showElementはjqueryの「fadeIn」関数を呼び出して、気の利いたフェードアウト/フェードイン効果を作成します。
<tbody data-bind='template: { foreach: entries,
beforeRemove: hideElement,
afterAdd: showElement }'>
私のモデルは次のようなものです。
var Model = function() {
self.entries = ko.mapping.fromJS([]);
this.getData = function() {
$.ajax({
url: "/test",
type: "GET",
success: function(response) {
ko.mapping.fromJS(response, self.entries);
...
this.showElement = function(elem) {
if(elem.nodeName == "TR") {
$(elem).fadeIn(500);
}
};
this.hideElement = function(elem) {
if(elem.nodeName == "TR") {
$(elem).fadeOut(500);
};
};
...
問題は、ajax応答でが呼び出されるたびに、ko.mapping.fromJS(response, self.entries)
まったく同じであっても、ノックアウトがエントリを削除/追加しているように見えることです。そのため、showElement / hiddenElementが呼び出され、テーブル内の要素はajax呼び出しごとに削除/追加されるため、「点滅」しています。
こんな感じなのか、間違って使っているのか?