2015-12-04 114 views
0

我對淘汰賽有些新穎,並且遇到了一些與觀測值有關的問題。這是一些淘汰賽我使用的配對縮小版本:KO計算重新計算但不更新用戶界面

var model; 
function viewModel(data) { 
    var self = this;  
    self.favesData = ko.observableArray(data.User.Favorites);  
    self.splitRows = ko.computed(function() { 
     var i = 0; 
     var faveRows = []; 
     var size = 2; 
     while (i < self.favesData().length) { 
      faveRows.push(self.favesData().slice(i, i += size)); 
     } 
     return faveRows; 
    }); 

    self.refresh = (function (data) { 
     self.favesData(data.User.Favorites); 
    }); 
} 

function onComplete(result) { 
    if (!model) { 
     model = new viewModel(result); 
     ko.applyBindings(new viewModel(result)); 
    } else { 
     model.refresh(result); 
    } 
} 

<table class="table-main link" data-bind="foreach: splitRows"> 
    <tr data-bind="foreach: $data"> 
     <td> 
      <div class="link"> 
       <a href="#" data-bind="text: $data.Name"> 
       </a> 
      </div> 
     </td> 
    </tr> 
</table> 

我使用AJAX GET,它調用的onComplete。數據進來很好,所有的東西在初始負載上都很好。然後我用新的輸入調用相同的ajax函數,它開始正常工作 - 數據返回並且不同,刷新更新favesData,並且splitRows重新計算,但UI顯示永不改變。 不應該splitRows重新計算時更新綁定? 我很困惑如何將新數據傳遞給favesData可以更新觀察它的計算觀察值,但計算的觀察值不會更新UI。

回答

3

在你的onComplete方法中,你沒有將標記綁定到模型,而是綁定到viewModel的新實例,它應該如下所示。

ko.applyBindings(model); 

刷新被稱爲上未使用的UI模型

+0

哦,男人,魔鬼是在細節。謝謝! – withoutIf

0

嘗試clearing the array and pushing the new items in,類似;

self.favesData.removeAll(); 
data.User.Favorites.each(function(fav) { self.favesData.push(fav); }); 

看看是否這樣排序。我傾向於使用官方的knockout mapping plugin,它能夠很好地從服務器上「敲出」模型並刷新它們。

所以通常你最終做您的視圖模型

self.refresh = function(data) { 
    ko.mapping.fromJS(data, {}, self); 
} 

裏面的東西這樣對整個模型重新綁定耳目一新。

+0

我不明白爲什麼人們將數組中的項目推送到可觀察數組中。把數組放在那裏。或者,如果您需要將它作爲數組的單獨副本,請使用'slice'。 –

+0

@RoyJ - 這就是OP在刷新方法中似乎正在做的事情,但它不起作用。清除和重新設置可能會提供有關錯誤的線索。 –