2012-06-28 30 views
0

我想在Ember.js中實現一個固定長度的數組控制器,並使它在列表中刪除第一個項目超過其容量。我的嘗試是在下面,但它失敗並出現錯誤。在Ember.js中實現先進先出固定長度的數組控制器

EDIT:我現在在http://jsfiddle.net/EsF4R/39/

有一個簡單的jsfiddle我有一個是與陣列控制器相關聯的視圖。我相信這個錯誤是由於這個觀點。當我刪除它時,錯誤消失,我可以彈出第一個對象。 (注意:視圖工作正常,直到我嘗試實現FIFO功能。)

我也嘗試將popFirst函數的內容放入runloop(Ember.run(...))中。

有誰知道我該如何實現這個FIFO陣列,並使視圖仍然工作?

MyApp.fifoController = Ember.ArrayController.create({ 
    content: [], 
    popFirst: (function() { 
    if (this.get('length') >= 3) { 
     return this.removeObject(this.get('firstObject')); 
    } 
    }).observes('length') 
}); 

<div id="fifo-pool"> 
    {{#each MyApp.fifoController}} 
    {{#view MyApp.ItemView contentBinding="this"}}{{/view}} 
    {{/each}} 
</div> 


Error: 
Uncaught TypeError: Cannot call method '_insertElementLater' of undefined genigames/vendor/ember:16704 
DOMManager.after genigames/vendor/ember:16704 
Ember.ContainerView.Ember.View.extend._scheduleInsertion genigames/vendor/ember:14708 
Ember.ContainerView.states.hasElement.childViewsDidChange genigames/vendor/ember:14765 
Ember.View.Ember.Object.extend.invokeForState genigames/vendor/ember:12902 
Ember.ContainerView.Ember.View.extend.childViewsDidChange genigames/vendor/ember:14687 
... 

編輯:我現在有一個簡單的jsfiddle在http://jsfiddle.net/EsF4R/39/

+0

你能張貼App.ItemView的代碼嗎?或者更好的Jsfiddle? –

+0

我不認爲這會解決您的問題,但看看如果使用集合而不是每個作品 '{{#collection elementId =「fifo-pool」contentBinding =「MyApp.fifoController」itemViewClass =「MyApp.ItemView」} }' –

+0

我編輯了上面的問題以包含jsFiddle的鏈接:http://jsfiddle.net/EsF4R/38/ –

回答

0

我想你要對這個錯誤的。您正在觀察長度,添加項目,刪除項目和仍然觀察長度。相反,您應該檢查是否需要刪除之前,甚至添加項目。 Ember有一個非常好的mixin系統,所以你可以覆蓋pushObject函數,檢查刪除,然後調用_super添加。看到這個例子:

MyApp.fifoController = Ember.ArrayController.create({ 
    content: [], 
    pushObject: function(object) { 
     if (this.get('length') >= 4) { 
      this.removeObject(this.get('firstObject')); 
     } 
     this._super.apply(this, arguments); 
    } 
}); 

http://jsfiddle.net/MSKxG/

+0

所以這是非常好的,只要我使用pushObject,我可以構造應用程序,以便始終調用pushObject,但在我看來,這不是一般的解決方案,因爲它可能會觀察'長度'或者當一個對象(試圖被添加)時被另外通知。 –