2013-04-26 71 views
2

我与灰烬数据侧载性能上被丢弃的模型

  • 灰烬RC3
  • 灰烬数据修订12个
  • 把手RC3

我有灰烬数据侧面加载关系上工作很多我的模型,以便我可以像这样模拟sideloaded关系:

// 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分之一重新加载左右。每隔一段时间,sideloaded关系(在这种情况下hasMany关系model.clients)不呈现给模板,而所有其他模型属性(而不是关系)呈现给模板。奇怪的是,它每隔一段时间就会这样做。

我不太清楚怎么还我可以设置这个问题的JS小提琴,所以我想问问:

凡在调用堆栈可能我设置一个断点,看看有什么属性将实际得到渲染?

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

+0

你可以用Ember.View包装你的模板,并在那里“渲染”,那里你有一个缓冲区可用,是你在找什么?我还将ember.js更新到rc3,以防万一 – intuitivepixel 2013-04-27 00:01:00

+0

我确实升级了,谢谢,但没有任何改进。它变成了模型,但在渲染钩子中调试是一条有趣的线。感谢您的建议。 – ianstarz 2013-04-28 04:37:56

+0

如果你冒险,你可以尝试这个铬扩展(仍在开发中,但不是全功能,但有时仍然有用)https://github.com/tildeio/ember-extension看看 – intuitivepixel 2013-04-28 21:21:32

回答

4

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

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会做的UserRouteextract()extractMany()UsersRoute。然而,有趣的是,大多数时间extractMany()(用于获取所有用户的JSON返回)将在单用户及其侧装属性的extract()之前发生。发生这种情况时,sideloaded属性确实会呈现给模板。但是,每隔一段时间extract()会在extractMany()之前(它异步“击败”提取多数),sideloaded属性不会呈现。我认为这是因为如果extract()首先发生,那么当所有模型发生extractMany()时,该模型将被重置,当提取许多模型时,该模型不具有sideloaded属性。

我通过以下操作解决了这个第一个问题:

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钩子重新加载模型。

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

这将迫使模型与侧载性能每隔这条路线“激活”的时候,这是需要我们建立反正这个特定的应用程序重新加载。

希望这可以帮助别人!

1

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

printRelationship: function() { 
    console.log(model.clients.get('length'), model.clients); 
}.computed([email protected]); 
+0

这是缩小了问题,当您按照您所示的方式进行控制台日志时,模型实际上没有客户端,并且当页面未呈现它们时 – ianstarz 2013-04-27 18:12:48

+0

您能否显示如何定义模型? – 2013-04-27 22:53:50

+0

我将模型添加到代码块 – ianstarz 2013-04-28 04:46:10