4

我的用户和工作区模型具有 belongsTo / hasMany 关系:

App.User = DS.Model.extend({
  name: DS.attr('string'),
  workspace: DS.belongsTo('App.Workspace')
});

App.Workspace = DS.Model.extend({
  name: DS.attr('string'),
  users: DS.hasMany('App.User')
});

我有一个控制器和视图设置,控制器的模型属性设置为有效用户。

App.ApplicationRoute = Ember.Route.extend({
  setupController: function() {
    this.controllerFor('test').set('model', App.User.find(1));
  }
});

下面的代码和输出表明,在代码执行时,belongsTo 关联尚未加载。从视图类访问工作区(通过用户)的正确方法是什么?

App.TestView = Ember.View.extend({

  didInsertElement: function() {
    var self = this;

    console.log('first try: ');
    console.log(this.get('controller.model.workspace'));

    setTimeout(function() {
      console.log('second try: ');
      console.log(self.get('controller.model.workspace'));
    }, 1000);
  }
});

输出;

// first try: 
// null 
// second try: 
// Class { ... }

我可以通过 {{model.workspace}} 访问模板中的工作区——如何在视图类中做同样的事情?

4

1 回答 1

10

从视图类访问工作区(通过用户)的正确方法是什么?

您的方法this.get('controller.model.workspace')是从您的视图访问工作区的正确方法。但是正如您的示例所示, didInsertElement() 钩子是错误的地方。由于App.User.find(1)是异步的,因此在渲染模板时,您不能指望model.workspace(甚至model它本身)可用。这就是你的 console.log 第一次返回 null 的原因。

这可能并不明显,因为 Ember 非常努力地消除显式形式的异步行为。由于它会立即返回一个模型引用,我们可能希望App.User.find()它是同步的,但事实并非如此。查看管理异步以更详细地了解细节。

我可以通过 {{model.workspace}} 访问模板中的工作区——如何在视图类中做同样的事情?

在幕后,handlebars 绑定{{model.workspace}}到您的模型并在值更改时重新渲染模板。您应该在视图类中使用类似的技术。根据您要完成的任务,您可能希望使用绑定、计算属性或观察者。例如:

App.TestView = Ember.View.extend({

  workspaceChanged: function() {
    console.log('workspaceChanged to: ');
    console.log(this.get('controller.model.workspace'));        
  }.observes('controller.model.workspace')

});

另请参阅绑定。观察者,计算属性:我什么时候使用?

于 2013-01-30T22:36:25.580 回答