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

ian*_*arz 2 handlebars.js ember.js ember-data

我正在和我一起工作

  • 恩伯RC3
  • Ember数据修订版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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

ian*_*arz 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

因此,导航到路由时'clients/3'DS.JSONSerializer会做的extract()UserRouteextractMany()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');
  });
});
Run Code Online (Sandbox Code Playgroud)

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

问题二:当浏览远离client/3clients,然后回client/3再次,该模型将被重置,就像第一个问题-侧载性能会得到下降.

解决这个问题的方法是使用UserRoute's activatehook来重新加载模型.

App.UserRoute = Ember.Route.extend({
  activate: function() {
    this.modelFor('user').reload();
  }
});
Run Code Online (Sandbox Code Playgroud)

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

希望这有助于某人!