2

我正在与

  • 余烬 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>

这非常有效......除了每 10 次重新加载中的 1 次左右。每隔一段时间,sideloaded 关系(在这种情况下是hasManyrelationship model.clients)不会渲染到模板,而所有其他模型属性(不是关系)都会渲染到模板。奇怪的是,它只是每隔一段时间才会这样做。

我还不太确定如何为这个问题设置一个 js fiddle,所以我想问一下:

我可以在调用堆栈的哪个位置设置断点以查看实际会呈现哪些属性?

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

4

2 回答 2

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.JSONSerializerextract()为 theUserRouteextractMany()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/3to导航到clients然后再返回到client/3时,模型会像第一个问题一样被重置——sideloaded 属性会被丢弃。

解决这个问题的方法是使用UserRoute'activate钩子重新加载模型。

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

这将强制每次该路由“激活”时使用侧载属性重新加载模型,这是我们正在构建的这个特定应用程序所需要的。

希望这对某人有帮助!

于 2013-04-29T02:15:47.030 回答
1

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

printRelationship: function() {
  console.log(model.clients.get('length'), model.clients);
}.computed(model.clients.@each);
于 2013-04-27T00:30:07.757 回答