如何从Ember中的另一个控制器访问模型

时间:2014-11-09 23:38:20

标签: ember.js firebase emberfire

这是一个新手问题:我在商店中创建一个新的章节记录(Ember-data)。我想将章​​节ID添加到用户模型记录的User.chapters属性。

App.Book = DS.Model.extend({
  name: DS.attr('string'),
  icon: DS.attr('string'),
  description: DS.attr('string'),
  createdDate: DS.attr('date'),
  chapters: DS.hasMany('chapter', { inverse: 'book', async: true}),
  bookAssignments: DS.hasMany('bookAssignment', {async: true}),
  user: DS.belongsTo('user', { inverse: 'books', async: true} ),
});

App.Chapter = DS.Model.extend({
  name: DS.attr('string'),
  description: DS.attr('string'),
  source: DS.attr('string'),
  book: DS.belongsTo('book', { inverse: 'chapters', async: true}),
  user: DS.belongsTo('user', { inverse: 'chapters', async: true} )
});

App.User = DS.Model.extend({
  uid: DS.attr('string'),
  displayName: DS.attr('string'),
  firstName: DS.attr('string'),
  lastName: DS.attr('string'),
  books: DS.hasMany('condition', { inverse: 'user', async: true}),
  chapters: DS.hasMany('statistic', { inverse: 'user', async: true}),
});

我创建了一个Session对象,我将其注入到路由和控制器中

App.Session = Ember.Object.extend({
  user: null,
  userID: '',
});

Ember.Application.initializer({
  initialize: function (container, application) {
    App.register('session:main', App.Session.create(), { instantiate: false, singleton: true });
    // Add `session` object to route to check user
    App.inject('route', 'session', 'session:main');
    // Add `session` object to controller to visualize in templates
    App.inject('controller', 'session', 'session:main');
  }
});

但是,Session对象不是Model,无法使用Save()方法保存到Store:

user.save()

我探索的另一个选项是从用户路径模型挂钩访问用户记录。用户路线:

App.UserRoute = Ember.Route.extend({
  model: function() {
    //var session = this.get('session');
    var user = '';
    var _isAutheticated = this.isAutheticated;
    var store = this.store;
    var _firebase = new Firebase("https://dynamicslife.firebaseio.com");
    _firebase.onAuth(function(authData) { 
      if (authData) {
        _isAutheticated = true;
        console.log('user authenticated with Firebase', authData.uid);  
        user = store.find('user', authData.uid).then(function(_user) {
          console.log('user found', _user);
          return _user;
        }, function(error) {
        // user does not exist or some other error
        console.log('please log again');     
      });
      } else if (error) {
        _isAutheticated = false;
        console.log('failled login attempt', error);
      }
    }); //end authWithOAuthPopup
    console.log('My user2: ', user);
    //this.set('isAutheticated', _isAutheticated);
    return user;
  }
});  

我尝试了需要从章节控制器访问用户记录:

App.ChaptersController = Ember.ArrayController.extend({ 
  needs: 'user',
  user: Ember.computed.alias("controllers.user.model"),
});

但是,用户仍然无法使用。

我想象我的语法不正确。如果有人能够以一种可以从章节控制器修改和保存的方式来指示我访问用户记录的正确方法,我将不胜感激。

章节路线未嵌套在用户路线下,因为模板未嵌套。我是否应该在用户路径下嵌套章节路线,即使模板没有嵌套使用ModelFor()?

2 个答案:

答案 0 :(得分:1)

您应该能够将会话对象注入所有控制器和/或路由。然后,您就可以在需要的地方访问它。

在会话中,创建一个名为user的属性,该属性将加载用户(可能使用您在路径中放置的代码),将所有内容链接到控制器中的“session.user”,您应该很高兴。< / p>

至于您的路由问题,如果您想从路由加载用户模型,则应该加载该路由。作为根路由或在路由树中。

答案 1 :(得分:1)

如果您尝试从章节模型访问特定记录,则可以使用控制器中的this.store.find('chapter', record_id)来执行此操作,因为store可用于所有控制器(和路由)。

如果你需要从控制器创建一个新章节记录,你可以this.store.createRecord('chapter'),它将为你提供一个空记录。

在这种情况下,不需要直接注入模型。