emberjs刷新ArrayController与arrangeContent和@each崩溃

时间:2014-12-07 05:42:56

标签: ember.js

Hy,感谢阅读:

我遇到了Ember.ArrayController和arrangeContent的问题。 Senario如下:

我的arrayController中的项目可以通过某些操作进行修改。 我的arrangeContent在其中一些项属性上被过滤。 因此,如果观察到的项属性更改,则应刷新arrangeContent属性

我通过使用property()

设置我的arrangeContent的"content.@each.myproperty"来实现此目的

一切正常,除非我尝试从路线刷新模型,然后收到错误消息TypeError: Cannot read property 'destroy' of undefined at ContainerView.extend.arrayWillChange

在某些情况下,它会起作用,但每次触发refresh()时都会复制内容

使用一些最小的代码可能会变得更加清晰......

App.IndexRoute = Ember.Route.extend({
  model : function(){
  return  [App.Cars.create({color : "red", model : "march"}),
           App.Cars.create({color : "yellow", model : "alto"}),
           App.Cars.create({color : "blue", model : "gundam"}) ];
  },
  actions : {
    reload : function(){
      this.refresh();
    }
  }
});

App.IndexController = Ember.ArrayController.extend({
  arrangedContent  : function(){
    var data= this.get("content");
    data=data.filter(function(elem){
      return elem.get("color").match(new RegExp("el","gi"))!==null;
    });
    return data;
  }.property("lenght","content.@each.color"),
  actions : {
    allYell :function(){
      this.get("content").forEach(function(elem){
        elem.set("color","yellow");
      });
    },
    erase : function(){
      if(this.get("length")>0){
        this.get("content").removeAt(0);
      }
    }
  }
});

可以在这里找到一个JSBin http://jsbin.com/yebopobetu/3/edit?html,js,console,output

1 个答案:

答案 0 :(得分:1)

我从未见过有人建议覆盖arrangedContent。老实说,我不推荐它。

App.IndexController = Ember.ArrayController.extend({
  foos  : function(){
    var data= this.get("model");
    return data.filter(function(elem){
      return elem.get("color").match(new RegExp("el","gi"))!==null;
    });
  }.property("@each.color"),
  actions : {
    allYell :function(){
      this.forEach(function(elem){
        elem.set("color","yellow");
      });
    },
    erase : function(){
      if(this.get("length")>0){
        this.removeAt(0);
      }
    }
  }
});

http://jsbin.com/sivugecunu/1/edit