我需要访问一个控制器属性来在我的RESTAdapter实例中构建自定义URL,但我找不到在适配器上下文中访问控制器的方法。这就是我所拥有的:
我有一个看起来像这样的简单模型:
App.Customer = DS.Model.extend(
{
first_name: DS.attr('string'),
last_name: DS.attr('string'),
date_of_birth: DS.attr('string'),
created_at: DS.attr('string'),
updated_at: DS.attr('string')
});
此模型的资源REST URL如下所示: https://api.server.com/v1/accounts/的:ACCOUNT_ID /客户/的:CUSTOMER_ID
我正在为大多数模型扩展Ember Data中的RESTAdapter,因此我可以单独自定义资源URL。像这样:
App.CustomerAdapter = DS.RESTAdapter.extend(
{
buildURL: function(type, id)
{
// I need access to an account_id here:
return "new_url";
}
});
如您所见,在此示例中,我需要URL中的帐户ID才能查询客户对象。帐户ID是用户登录时必须提供的内容,并存储在AccountController
Ember.Controller
的实例中。
我的问题是,我如何通过AccountController
内的CustomerAdapter
访问媒体资源?以下是我尝试过的事情,无有效:
App.CustomerAdapter = DS.RESTAdapter.extend(
{
buildURL: function(type, id)
{
var account_id = this.controllerFor('account').get('activeAccount').get('id');
return "new_url";
}
});
,
App.CustomerAdapter = DS.RESTAdapter.extend(
{
needs: ['account'],
accountController: Ember.computed.alias("controllers.account"),
buildURL: function(type, id)
{
var account_id = this.get('accountController').get('activeAccount').get('id');
return "new_url";
}
});
,
App.CustomerAdapter = DS.RESTAdapter.extend(
{
activeAccountBinding = Ember.Binding.oneWay('App.AccountController.activeAccount');
buildURL: function(type, id)
{
var account_id = this.get('activeAccount').get('id');
return "new_url";
}
});
此时,我能想到的唯一黑客就是将帐户ID放在Ember之外的全局变量中,并从适配器中的那里访问它。
其他建议?
答案 0 :(得分:1)
我们有类似的问题,基本上我们做了一个全局变量,并对此感到内疚。我们的是Ember模型,但存在相同的概念和问题。另一种解决方案是使用findQuery,但这会返回一个集合,因此您必须将该项目从集合中拉出。
App.CustomerAdapter = DS.RESTAdapter.extend(
{
buildURL: function(type, id)
{
var params = type.params;
return "new_url" + params.account_id;
}
});
在某些路线中:
App.BlahRoute = Em.Route.extend({
model: function(params){
App.Customer.params = {account_id:123};
this.get('store').find('customer', 3);
}
});
答案 1 :(得分:0)
我知道您可以在另一个控制器的上下文中访问控制器的属性。
我看到你尝试过有点类似,但无论如何这可能适用于适配器:
App.YourController = Ember.ObjectController.extend({
needs: ['theOtherController'],
someFunction: function () {
var con = this.get('controllers.theOtherController');
return con.get('propertyYouNeed');
},
});
另外,您是否考虑过将AccountId属性添加到Customer模型中?
也许通过正确的路由可以实现自动URL?