2012-06-28 3 views
0

Ember.js에 고정 길이 어레이 컨트롤러를 구현하려고하고 있는데 목록에서 첫 번째 항목을 제거하도록하고 있습니다 용량을 초과합니다. 내 시도는 아래에 있지만 오류로 인해 실패하고 있습니다.Ember.js에서 선입 선출 고정 길이 어레이 컨트롤러 구현

EDIT : 지금 http://jsfiddle.net/EsF4R/39/

에서 간단한 jsFiddle가 나는 어레이 제어기와 관련된 뷰를 갖는다. 나는이 오류가 시야에 있다고 믿는다. 제거하면 오류가 사라지고 첫 번째 객체가 튀어 나옵니다. (참고 : FIFO 기능을 구현할 때까지보기가 정상적으로 작동했습니다.)

또한 pop 루프 함수 (Ember.run (...))에 popFirst 함수의 내용을 넣으려고했습니다.

누구든지이 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 
... 

편집 : 지금 당신이 잘못에 대해 갈 생각 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

에서 간단한 jsFiddle 있습니다. 길이를 관찰하고, 항목을 추가하고, 항목을 제거하고, 여전히 길이를 관찰합니다. 대신 항목을 추가하기 전에 제거해야하는지 확인해야합니다. 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가 항상 호출되도록 앱을 구조화 할 수는 있지만, 이것은 이것이 일반적인 해결책이 아니라 '길이' 또는 객체가 추가하려고 할 때 다른 방법으로 통지됩니다. –

관련 문제