将ArrayController模型绑定到存储/同步ArrayController和Store

时间:2014-08-06 08:54:33

标签: ember.js model ember-data

我目前正在努力使用Arraycontroller和它的模型。如果商店中的数据发生变化,它根本不会改变。特别是如果将记录附加到商店,我希望处理这些条目的数组控制器与商店一起更新。我认为有一些数据绑定,但它似乎根本不是这样。

我们说我有这条路线:/#/institute/10/user-administration

学院模型看起来像

App.Institute = DS.Model.extend({
  name: DS.attr('string'),
  users: DS.hasMany('user', {async:true})
});

这就是我如何设置Arraycontroller的模型:

App.UserAdministrationRoute = Ember.Route.extend({
  model : function() {
    // get users from the current institute
    return this.modelFor('institute').get("users").then(function(users) {
      return users.filter(function(item, index, enumerable){
        // filter anonymous dummy users
        return item.get('name') != "~dummy~";
      });
    });
  }
});

在UserAdministration-Controller中我做了

App.UserAdministrationController = Ember.ArrayController.extend({
  needs: ['institute'],
  actions : {
    createNewUser : function() {
      var newUser = this.store.createRecord('User', {
        role : 0
      });
      this.transitionToRoute('user-administration.edit', newUser);
    }
  }
});

在路线user-administration.edit中,我使用this.get('model').save();

保存用户

但ArrayController没有使用商店中刚刚创建和保存的新记录进行更新。 我想如果我将控制器模型挂钩到filter上可能有一种方法,但我如何定义一个过滤器来定义ArrayController的模型。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:0)

由于绑定是异步的,我认为你需要明确设置关联(参见https://github.com/emberjs/data/issues/1532)。

App.UserAdministrationController = Ember.ArrayController.extend({
  needs: ['institute'],
  actions : {
    createNewUser : function() {
      var newUser = this.store.createRecord('User', {
        role : 0
      });

      // NEW
      this.get('controllers.institute.model.users').then(function(users) {
        users.addObject(newUser);
      });
      // END NEW

      this.transitionToRoute('user-administration.edit', newUser);
    }
  }
});

答案 1 :(得分:0)

在考虑了一点并考虑this question之后,我可以自己解决这个问题。 ArrayController实际上并没有真正绑定到商店,因为我没有将store.filter设置为模型。

为了实现Arraycontroller始终与商店的数据同步,我必须将过滤器定义为模型。我的路线中的模型现在看起来像这样,就像一个魅力!

App.UserAdministrationRoute = Ember.Route.extend({
  model : function() {
    var scope = this;
    return this.modelFor('institute').get("users").then(function(){
      return scope.store.filter('user', function(user){
        return user.get('name') != "~dummy~";
      });
    });
  }
});

过滤和查询数据之间存在巨大差异,我只需要意识到:SHOULD I USE A QUERY OR A FILTER TO SEARCH RECORDS?