在模型上删除Ember Data侧载属性

时间:2013-04-26 23:21:28

标签: ember.js handlebars.js ember-data

我正在使用

  • Ember RC3
  • Ember Data Revision 12
  • 把手RC3

我在很多模型上都有Ember Data加载关系,所以我可以像这样模板化侧载关系:

// Models
App.Client = DS.Model.extend({
    company: DS.attr('string'),
    accountNumber: DS.attr('string'),
    startDate: DS.attr('mysqlDate'),

    // Relationships
    campaigns: DS.hasMany('App.Campaign'),
    users: DS.hasMany('App.User'),
    phones: DS.hasMany('App.Phone'),
    addresses: DS.hasMany('App.Address')
});

App.User = DS.Model.extend({
    email: DS.attr('string'),
    password: DS.attr('string'),

    // Relationships
    userType: DS.belongsTo('App.UserType'),
    role: DS.belongsTo('App.Role'),
    clients: DS.hasMany('App.Client'),
    phones: DS.hasMany('App.Phone'),
    addresses: DS.hasMany('App.Address')
});

<!-- template -->
<script type="text/x-handlebars" data-template-name="user/index">
  <h2>{{email}}</h2>
  <h5>Clients</h5>
  <ul>
    {{#each client in model.clients}}
      <li>{{client.company}}</li>
    {{/each}}
  </ul>
</script>

这非常有效...除了每10次重新加载一次之外。每隔一段时间,侧载关系(在这种情况下为hasMany关系model.clients)不会渲染到模板,而所有其他模型属性(不是关系)都会呈现给模板。奇怪的是,它每隔一段时间才会这样做。

我不太确定如何为这个问题设置js小提琴,所以我想问:

在调用堆栈中我可以设置一个断点来查看实际渲染的属性吗?

我在问题模板中使用{{debugger}},我只是不确定在调用堆栈中检查应用程序状态的最佳位置。

2 个答案:

答案 0 :(得分:5)

所以,我的问题是双重的。 第一个问题:这是我的路由器地图和路线:

App.Router.map(function() {
  this.resource('users', function() {
    this.route('create');
    this.resource('user', { path: ':user_id' }, function() {
      this.route('edit');
      this.route('delete');
    });
  });
});

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

// Default for this route
App.UserRoute = Ember.Route.extend({
  model: function(params) {
    return App.User.find(params.user_id);
  }
});

因此,当导航到路线'clients/3'时,DS.JSONSerializer将为extract()执行UserRoute,为extractMany()执行UsersRoute 。但是,有趣的是,大多数时候extractMany()(用于获取所有用户的JSON返回)将在extract()之前发生,用于单个用户及其侧载属性。发生这种情况时,侧载属性确实会呈现给模板。但是,每隔一段时间extract()就会出现extractMany()(它异步“击败”提取多次),侧载属性不会呈现。我认为这是因为如果extract()首先出现该模型,那么当所有模型发生extractMany()时,该模型将被重置,当提取许多模型时,没有侧载属性。

我通过执行以下操作修复了第一个问题:

App.Router.map(function() {
  this.resource('users', function() {
    this.route('create');
  });

  this.resource('user', { path: 'user/:user_id' }, function() {
    this.route('edit');
    this.route('delete');
  });
});

这阻止了两个模型在同一路径中被提取,但以下可能已经解决了这两个问题。

第二个问题:当从client/3导航到clients然后又回到client/3时,模型会像第一个问题一样重置 - 负载的属性会被丢弃。

解决此问题的方法是使用UserRoute的{​​{1}}挂钩重新加载模型。

activate

每次此路线“激活”时,这将强制模型重新加载侧载属性,这对于我们正在构建的特定应用程序是必需的。

希望这有助于某人!

答案 1 :(得分:1)

您可能希望拥有一个自定义属性来观察您的关联并在控制台中打印其内容。

printRelationship: function() {
  console.log(model.clients.get('length'), model.clients);
}.computed(model.clients.@each);