理解emberjs模型初始化和依赖

时间:2014-07-21 16:50:45

标签: javascript ember.js routes ember-data models

我现在正变得贪图......在学习和尝试的过程中意味着可怕和糟糕的时代......无论如何,我真的希望有人能帮助理解这一点:

我的路线图就是这样:

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
  • 一旦我选择了一个案例并且我要加载更多依赖于学院ID和案例ID的数据,一切都会如何工作?
  • 我正在使用ember-simple-auth进行身份验证
  • 我设计了api和客户端,所以如果你认为其中任何一个方向错误,请告诉我
  • 我真的被困在这里,并认为我可能面临设计问题或至少是一个理解问题。这些指南和例子不再能帮到我,他们从不处理这种依赖。
  • 编辑:我把模型决定放在AllCases路线中,就像史蒂夫H.提出的那样。不幸的是,它不会触发API请求,一旦我刷新页面,它会变得更糟,因为我的研究所都丢失了,也没有尝试请求它们。

我希望到目前为止我提供了有关我的设计的足够信息,任何人都可以在这里真正了解我的问题。如果我需要提供更多,请告诉我...... Ember到目前为止一直非常棒,我想要解决这个问题,只是不知道如何继续。提前感谢您的帮助!

1 个答案:

答案 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.AllCasesIndexRouteApp.AllCasesIndexController而非此映射:

this.resource("all-cases");

将使用App.AllCasesRouteApp.AllCasesController

此外,你没有提出案件请求的原因可以修改如下:

App.Institute = DS.Model.extend({
  name: DS.attr('string'),
  [...]
  cases: DS.hasMany('case', {async: true})
});

如果没有{async: true},Ember会假设数据来自Institute的有效负载。