控制器计算属性不会立即显示新数据添加,其中数据不是从路径模型返回的数据

时间:2013-08-23 21:37:25

标签: ember.js

要点:

控制器计算属性问题:在一种情况下,我可以看到所有添加的内容但没有立即看到新添加的内容(jsbin),在另一种情况下,我可以立即看到新添加的内容但是之前添加的内容未显示(jsbin)。

8月26日的第二次更新:

所以我在想...我有两个互补的代码片段。我只需要将它们结合起来并实现完美,对吧?可悲的是,它失败了,就像你can see in this jsbin一样,没有任何表现。 :(

这是我的失败的尝试合并两个RecordArrays:

officelist: function(){
  var allrecords = [];
  console.log("in oficelist");

  // get the record array that shows previously added records
  var a_recordarray =  App.Office.find({org_id: 'myorgid'});
  a_recordarray.forEach(function(record){
    allrecords.push(record);
  });
  console.log(a_recordarray.toString());
  console.log(allrecords.length);

  // get the record array that shows newly added records
  var b_recordarray = App.Office.filter(function(office) {
        return office.get('org_id') === 'myorgid';
    });
  b_recordarray.forEach(function(record){
    allrecords.push(record);
  });
  console.log(b_recordarray.toString());
  console.log(allrecords.length);

  // return the combination
  return allrecords;

}.property('content.@each')

详细说明:

我有这个simple jsbin app在代码中使用控制器计算属性来显示要显示的名称列表。问题是,无论何时添加新名称,您都必须刷新页面才能看到它的显示。

您可以看到code here

具有计算属性的控制器代码:

officelist: function(){
  return App.Office.find({org_id: 'myorgid'});
}.property('content.@each')

路线返回不同的模型:

App.OrganizationRoute = Ember.Route.extend({
  model: function() {
    return App.Org.find();
  }
});

车把:

{{#each officelist}}
  <li>{{officename}} </li>
{{/each}}

约束:我确实需要'org_id'存在,我确实需要让路径模型从显示的模型中返回不同的模型。

8月26日更新: Jonathan has made some progress但请注意我对他的回答的评论,因为它没有完全解决问题。

8月24日更新:增加了要显示的数据与路由器模型中返回的数据不同的复杂性。 (还将ArrayController更改为ObjectController,但由于ObjectController还具有content属性,因此此更改没有任何后果。),下面是旧的东西:

<击> 具有计算属性的控制器代码:

officelist: function(){
  return App.Office.find({org_id: 'myorgid'});
}.property('office.@each')

车把:

{{#each officelist}}
  <li>{{officename}} </li>
{{/each}}

<击>

3 个答案:

答案 0 :(得分:1)

问题是计算属性是缓存的,只会在office.@each更改时刷新。 {1}}属性未在该控制器上定义,因此office始终为null。可能你想要的是office.@each。所以:

content.@each

现在,只要添加新办公室,页面就会刷新。

答案 1 :(得分:1)

将App.OrganizationController的行政财产更改为:

officelist: function() {
  return App.Office.filter(function(office) {
    return office.get('org_id') === 'myorgid';
  });
}.property()

原因是调用App.Office.find()尝试从适配器中获取(在您的情况下为localStorage)。你要做的只是把它拉出商店。为此,App.Office.filter()(在其他情况下,App.Office.all())是您的朋友。

<强>更新

要同时获取之前保存的其他办公室,请使用find()获取它们。你可能会这样做的地方是控制器在路由的setupController挂钩中初始化。

App.OrganizationRoute = Ember.Route.extend({
  model: function() {
    return App.Org.find();
  },
  setupController: function(controller, model) {
    this._super.apply(this, arguments);
    App.Office.find({org_id: 'myorgid'});
  }
});

您不必担心存储结果,因为任何生成的Office记录都会加载到商店中,您的App.Office.all()App.Office.filter()来电将自动获得更新。

答案 2 :(得分:1)

如果您未使用find参数进行org_id调用,则一切正常:

officelist: function(){
  return App.Office.find();
}.property('content.@each')

jsbin