【问题标题】:Bind ArrayController model to Store / synchronize ArrayController with Store将 ArrayController 模型绑定到 Store / 将 ArrayController 与 Store 同步
【发布时间】:2014-08-06 08:54:32
【问题描述】:

我目前正在努力使用 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 模型的方式定义过滤器。

感谢您对此的任何帮助。

【问题讨论】:

    标签: ember.js model ember-data


    【解决方案1】:

    由于绑定是异步的,我认为您需要显式设置关联(参见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);
        }
      }
    });
    

    【讨论】:

    • 感谢您的帮助。这是有道理的,无论如何我都应该这样做,但不幸的是,它仍然没有更新UserAdministrationController 的内容/模型中的用户数组。感觉 ArrayController 的模型根本就没有绑定到 store 上。
    【解决方案2】:

    在考虑了更多并关注this question之后,我可以自己弄清楚。 ArrayController 实际上并没有真正绑定到 store,因为我没有将 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?

    【讨论】:

    • 很高兴看到我对另一个问题的回答对您有所帮助:-)
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多