我对ember很新,并没有真正区分两种语法。我应该在哪种情况下使用哪种情况。即哪一个更适合在路由中使用,哪一个适用于控制器。
this.get('model')
与
相反this.modelFor('artists/show')
答案 0 :(得分:6)
this.get('model') //controller call
this.modelFor('someRoute') //route call
在Ember中,默认情况下路由setupController
挂钩执行以下一行代码:
setupController: function(controller, model){
controller.set('model', model);
}
这将从model
挂钩返回任何内容,并使用此值设置控制器的model
属性。在控制器内,this.get('model')
是访问此模型的正确方法。此外,开发人员可以覆盖此挂钩并执行不同的操作,例如将model
设置为等于从model
挂钩(controller.set('model', model.prop)
返回的内容的某些子属性。这值得注意,因为当你从另一条路线拨打this.modelFor
时,你不会得到由setupController
设置的路由相关控制器的模型。你得到{{1}返回的任何内容} hook,如果我没记错的话,它是封面下的model
属性。
答案 1 :(得分:4)
this.get(' model')从当前控制器范围中提取模型。
this.modelFor(' artists / show')获取将在指定路线范围内的模型。
答案 2 :(得分:3)
this.get(' model')将在计算属性中用于控制器中,比如说。
this.modelFor用于访问父路由模型的路由,例如重用或解析它。
答案 3 :(得分:3)
这两个是在不同的ember对象上定义的 - 控制器上的model
属性和路径上的modelFor
方法。
首先,model
属性,并将其作为this.get('model')
执行,只获取已在控制器中的model
属性上设置的对象。这意味着它获得了在路由中setupController
挂钩期间设置的任何内容。您无法使用此语句从API获取任何数据。此外,它只允许您获取在当前控制器(this
范围)上设置的对象。
在setupController
钩子里。路线的生命周期首先解决所有与模型相关的回调(beforeModel
,model
和afterModel
)。之后,它使用以下参数执行setupController
:(controller, model)
。这意味着它可以访问从model
挂钩和当前controller
实例解析的所有内容。默认情况下,setupController
会在model
属性上设置controller.model
:
controller.set('model', model);
您可以使用自定义代码覆盖该代码,例如在myModel
属性上设置您的模型 - 这取决于您。但是,如果您想在控制器代码中获取模型,则必须始终查询设置模型的属性。
modelFor
在路由实例上定义,允许您从应用程序中的任何路由获取model
挂钩结果。您可以在setupController
挂钩中使用它,如下所示:
controller.set('model', this.modelFor('myOtherRoute'));
此行为可被视为提高整个应用程序的一致性 - 它明确表示在当前路由和控制器中使用与myOtherRoute
中相同的数据。
它是如何工作的?它查询myOtherRoute.model
属性,该属性存储该路由的model
已解析数据。实现非常简单 - 它会查找名为container
的路由的myOtherRoute
(存储路由,控制器,组件等的全局对象)并获取model
属性。< / p>