gpt4 book ai didi

ember.js - Ember Data 侧载属性被放置在模型上

转载 作者:行者123 更新时间:2023-12-02 05:56:13 25 4
gpt4 key购买 nike

我在工作

  • Ember RC3
  • Ember 数据修订版 12
  • RC3 Handlebars

我的许多模型上都有 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 次。每隔一段时间,侧载关系(在本例中为 hasMany 关系 model.clients)不会呈现给模板,而所有其他模型属性(不是关系)会呈现到模板。奇怪的是它只是偶尔这样做一次。

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

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

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

最佳答案

所以,我的问题有两个方面。 第一个问题:这是我的路由器 map 和路线:

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() >UserRouteUsersRouteextractMany()。然而,有趣的是,大多数情况下,extractMany()(用于获取所有用户的 JSON 返回值)发生在 extract() 之前,用于单个用户及其侧载属性。当这种情况发生时,旁加载的属性确实会呈现给模板。然而,每隔一段时间 extract() 就会出现在 extractMany() 之前(它异步地“击败”extract many),旁加载的属性将不会呈现。我认为这是因为如果 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 时同样,模型会像第一个问题一样被重置——旁加载的属性会被丢弃。

解决此问题的方法是使用 UserRouteactivate Hook 重新加载模型。

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

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

希望这对某些人有帮助!

关于ember.js - Ember Data 侧载属性被放置在模型上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com