2013-09-10 55 views
0

我正在將標記中的ObservableArray排序,但由於某種原因,當我將新對象推送到頁ObservableArray時,這不會更新。KO ObservableArray在與.sort綁定時更新中斷

//store.get('pages') returns an ObservableArray 

<!-- ko foreach:store.get('pages').sort(function (l , r) { return l.pageNumber() < r.pageNumber() ? -1 : 1}) --> 
    <markup/> 
<!--/ko--> 

但是,當我刪除排序調用,它捕獲數組更改就好了。 像現在這樣,

//works fine, updates when item pushed to observableArray 
<!-- ko foreach:store.get('pages') --> 
    <markup/> 
<!--/ko--> 

任何想法,一個簡單的解決方法嗎?

編輯

使用valueHasMutated(),不強制更新任一嘗試。

解決方法: 我結束了那種呼叫移動到上observableArray訂閱,它似乎是現在的工作很好,不知道爲什麼,雖然。

+0

你有沒有嘗試過在你的viewmodel中將'sort'作爲'calculate'?這種排序並不屬於這個觀點。 – Tyrsius

+0

不幸的是,這也沒有做到。我確實找到了一種最終解決方案,謝謝! –

回答

1

store.get返回一個observableArray,但store.get(...).sort(...)返回一個數組。你有效地使單向像這樣綁定:

<div data-bind="foreach: ['foo', 'bar']"></div> 

此外,雖然你綁定一個函數調用的返回值,對我來說,有你與你的觀點耦合你的業務邏輯代碼的氣味邏輯。你有這樣的事情:

// View 
<div data-bind="foreach: $root.get()"></div> 

// Javascript 
function ViewModel() { 
    var self = this; 
    self.get = function() { 
     return ko.observableArray(); 
    }; 
} 

它的工作原理,但從你的角度來看,目前還不清楚你在做什麼。我想一個更好的解決辦法是:

// View 
<div data-bind="foreach: stores"></div> 

// Javascript 
function ViewModel() { 
    var self = this; 
    self.stores = ko.observableArray(); 
    self.get = function() { 
     var arr = ["foo", "bar"]; 
     stores(arr.sort(...));// When you do this, KO updates the foreach binding this is bound to 
     return stores;// not that you need to, you can access it from the viewModel. 
    }; 
} 

很高興你找到了一個解決方法,但需要一分鐘,並規劃出你的HTML結合的結構。這是我在創建新視圖時開始的第一個地方,它驅動我構建ViewModel的方式。