簡體   English   中英

如何從Ember中的另一個控制器訪問模型

[英]How to access a model from another controller in Ember

這是一個新手問題:我正在商店中創建一個新的Chapter記錄(Ember數據)。 我想將章​​節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');
  }
});

但是,會話對象不是模型,無法使用Save()方法保存到商店:

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;
  }
});  

我嘗試了Needs來從Chapter Controller中訪問User記錄:

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

但是,用戶仍然不可用。

我想象我的語法不正確。 如果有人可以指示我以可以從“章節”控制器中修改和保存的方式訪問用戶記錄的正確方法,我將不勝感激。

“章”路由未嵌套在“用戶”路由下,因為模板未嵌套。 即使模板沒有嵌套使用ModelFor(),我也應該在用戶路由下嵌套章節路由嗎?

您應該能夠將會話對象注入所有控制器和/或路由。 然后,您將可以在需要的地方訪問它。

在會話中,創建一個名為user的屬性,該屬性將加載用戶(也許使用您放置在該路由中的代碼),並將所有內容鏈接到控制器中的“ session.user”,您應該會做得很好。

關於路由問題,是的,如果要從路由加載用戶模型,則應加載該路由。 可以作為根路由,也可以在路由樹中。

如果您嘗試從章節模型訪問特定記錄,則可以通過控制器使用this.store.find('chapter', record_id) ,因為store適用於所有控制器(和路由)。

如果需要從控制器創建新的章節記錄,則可以執行this.store.createRecord('chapter') ,它將為您提供一個空的記錄。

在這種情況下,將無需直接注入模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM