0

概括:

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

8月26日第二次更新:

所以我在想……我有这两段互补的代码。我只需要结合它们并达到完美,对吗?可悲的是,它失败了,正如你在这个 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')

细节:

我有这个简单的 jsbin 应用程序,它在代码中使用控制器计算属性来显示要显示的名称列表。问题是,每当添加新名称时,您都必须刷新页面才能看到它显示出来。

你可以在这里看到它的代码

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

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 日更新:乔纳森取得了一些进展,但请参阅我对他的回答的评论,因为它并没有完全解决问题。

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

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

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

车把:

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

4

3 回答 3

1

office.@each问题是计算的属性被缓存并且仅在更改时才会刷新。该office属性未在该控制器上定义,因此office.@each始终为空。可能你想要的是content.@each. 所以:

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

现在,每当添加新办公室时,页面都会刷新。

于 2013-08-23T21:54:47.163 回答
1

如果您不find使用参数进行调用,org_id一切都会按您的意愿进行:

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

jsbin

于 2013-08-26T18:10:53.433 回答
1

将 App.OrganizationController 的 officelist 属性更改为:

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()调用将自动获取更新。

于 2013-08-26T04:03:10.270 回答