我现在正变得贪图......在学习和尝试的过程中意味着可怕和糟糕的时代......无论如何,我真的希望有人能帮助理解这一点:
我的路线图就是这样:
App.Router.map(function() {
this.resource("login");
this.resource("institute", { path: '/institute/:institute.id/' }, function(){
this.resource("all-cases", function(){
});
});
});
在我的loginRoute中,我使用findAll加载模型机构,这导致了一系列机构,这就是为什么控制器是一个ArrayController。验证成功或验证后,我通过API从商店加载模型。它们由视图显示,我使用它们来触发操作selectInsitute
并转换为all-cases
。
App.LoginRoute = Ember.Route.extend({
// login controller owns the institutes
model: function(){
return this.store.findAll('institute');
},
actions: {
// this hook is called if authentication fails
sessionAuthenticationFailed: function(message) {
[...]
},
// this hook is called once the login was successfull
sessionAuthenticationSucceeded: function(){
this.controller.sessionAuthenticationSucceeded();
}
}
});
App.LoginController = Ember.ArrayController.extend(SimpleAuth.LoginControllerMixin,{
authenticator: 'authenticator:custom',
// authentication is done, now change some UI and load some models
sessionAuthenticationSucceeded: function (){
[...]
this.set('content', this.store.findAll('institute'));
},
actions : {
selectInsitute : function(institute) {
this.transitionToRoute('all-cases.index', institute);
}
}
});
我的所有案例路线都是这样的。 编辑:我按照Steve H提出的模型定义。。需要实际做什么吗?它根本不觉得它有帮助。
App.AllCasesRoute = Ember.Route.extend(SimpleAuth.AuthenticatedRouteMixin, {
model: function(params, transition, queryParams){
var instModel = this.modelFor('institute');
console.debug(instModel);
var cases = instModel.get('cases');
console.debug(cases);
return cases;
}
});
App.AllCasesController = Ember.ArrayController.extend({
needs: ['login']
});
我把我的两个模型放在这样的某种关系中,虽然由于我的理解问题如何以适当的方式将instituteID放在那里,但是适配器还没有工作:
App.Institute = DS.Model.extend({
name: DS.attr('string'),
[...]
cases: DS.hasMany('case')
});
App.InstituteAdapter = DS.RESTAdapter.extend({
buildURL: function(type, id) {
return '/api/core/insts'
}
});
App.Case = DS.Model.extend({
name: DS.attr('string'),
institute: DS.belongsTo('institute')
});
App.CaseAdapter = DS.RESTAdapter.extend({
buildURL: function(type, id){
return '/api/core/institute/:instite_id/cases'
}
});
一旦我在所有案例路线上,我的URI看起来像这样:/#/institute/7/all-cases/
LoginRoute上的研究所的加载就像一个魅力,并且向全案例资源的过渡也很顺利。 以下我不明白的事情:
all-cases
路线刷新整个网站,所有机构模型都丢失了(我可以通过ember ff插件看到)并且不再从服务器请求它们了,我想因为路线不是已经激活,负责通过商店加载模型。如何确保始终通过LoginController加载和提供这些模型?all-cases
路由上选定的机构,以便通过活动的ID从API加载案例研究所,参见URI,例如7
我希望到目前为止我提供了有关我的设计的足够信息,任何人都可以在这里真正了解我的问题。如果我需要提供更多,请告诉我...... Ember到目前为止一直非常棒,我想要解决这个问题,只是不知道如何继续。提前感谢您的帮助!
答案 0 :(得分:1)
当您使用子资源(如cases
)时,您可以通过以下调用获取父资源:
App.AllCasesRoute = Ember.Route.extend(SimpleAuth.AuthenticatedRouteMixin, {
model: function(){
return this.modelFor('institute').get('cases');
}
});
modelFor
方法(http://emberjs.com/api/classes/Ember.Route.html#method_modelFor):
返回路由层次结构中父(或任何祖先)路由的模型。在转换期间,所有路由都必须解析模型对象,并且如果路由需要访问父路由的模型以便解析模型(或者只是从父级重用模型),它可以调用this.modelFor (theNameOfParentRoute)来检索它。
另外,请记住使用这样的路由器映射时:
this.resource("all-cases", function(){});
它将使用App.AllCasesIndexRoute
和App.AllCasesIndexController
而非此映射:
this.resource("all-cases");
将使用App.AllCasesRoute
和App.AllCasesController
。
此外,你没有提出案件请求的原因可以修改如下:
App.Institute = DS.Model.extend({
name: DS.attr('string'),
[...]
cases: DS.hasMany('case', {async: true})
});
如果没有{async: true}
,Ember会假设数据来自Institute
的有效负载。