使用Ember js从非嵌套路径访问路径模型

时间:2016-02-08 02:52:44

标签: javascript ember.js ember-router

我想知道从不同的非嵌套路由控制器访问路由模型的适当方法。  如果我的路线设置如下:(但这有效,不确定是否正确)

App.Router.map(function() {
  this.route('admin'); 
  this.route('page1');
}

Page 1路线的模型如下:

App.page1Model = {content:'Content of simple model'};

App.Page1Route = Ember.Route.extend({
   model(){
      return App.page1Model;
});

然后管理员想要访问page1路由,我只能这样做:

App.AdminController = Ember.Controller.extend({
    page1Model:App.page1Model,

    Now do stuff with page1Model.....
});

我曾尝试使用Ember.inject.controller()但是当我的路由嵌套并且我想从子进入父控制器时,这只适用于我。有没有办法使用这种语法来获得我想要的东西,还是有比现在更好的方法?

由于

2 个答案:

答案 0 :(得分:2)

您要求的内容存在固有问题:当用户在admin页面上时,他们不在page1页面上,因此没有page1上下文。您可能想问一些问题:

  • 如果用户从未前往/admin前往/page1会怎样?
  • 如果用户转到/page1然后/page2然后转到/admin会怎样?

我可以想到两种 Ember-esque 做你想做的事情的方式:

  1. Page1ModelService。在这里,您创建一个Ember.Service,其中包含Page1Model的实例。您将服务注入route:page1route:admin,然后让它们分别关闭实例。他们是否可以更改模型的哪个实例取决于您。
  2. Page1Model的{​​{1}}挂钩中返回model个实例。此路线位于route:applicationroute:page1之上,因此他们都可以按如下方式查找模型:

    // route:application model(){   return App.Page1Model.create(); }

    // route:page1 model(){   return this.modelFor('application'); }

答案 1 :(得分:0)

我能够通过使用寄存器和注入来实现我的目标。有人可以看看,如果这是通过Ember标准“正确”或者有更好的方法(@James A. Rosen :)),请告诉我吗?

OH!如果有更好的方法将模型附加到page1路线,请告诉我。虽然我不确定我是否喜欢create()之后的.model。

JSBIN:http://jsbin.com/tikezoyube/1/edit?html,js,output

JS的那个:

var App = Ember.Application.create();
var page1Model = {title:'Old Title'};
var page1ModelFactory = Ember.Object.extend({
    model : page1Model
});

App.Router.map(function(){
    this.route('page1');
    this.route('admin');
});

App.register('model:page1', page1ModelFactory);
App.inject('controller:admin','page1Model','model:page1');

App.Page1Route = Ember.Route.extend({
    model(){ return page1ModelFactory.create().model; }
});

App.AdminController = Ember.Controller.extend({
    actions:{
        updateTitle:function(){
            console.log(this.get('page1Model').model.title);

            this.get('page1Model').set('model.title','THE NEW TITLE!');

            console.log(this.get('page1Model').model.title);

            this.transitionToRoute('page1');
        }
    }
});

谢谢!