0

我正在尝试在 Ember.js 中实现一个固定长度的数组控制器,并让它在列表超出其容量时删除第一项。我的尝试如下,但失败并出现错误。

编辑:我现在在http://jsfiddle.net/EsF4R/39/有一个简单的 jsFiddle

我有一个与阵列控制器关联的视图。我相信错误是由于视图。当我删除它时,错误消失了,我能够弹出第一个对象。(注意:在我尝试实现 FIFO 功能之前,该视图运行良好。)

我还尝试将 popFirst 函数的内容放在运行循环(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
...

编辑:我现在在http://jsfiddle.net/EsF4R/39/有一个简单的 jsFiddle

4

1 回答 1

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/

于 2012-06-29T22:17:00.600 回答