2014-11-09 4 views
0

Это новичок: я создаю новую запись главы в Хранилище (Ember-data). Я хочу добавить идентификатор главы в свойство User.chapters записи User Model.Как получить доступ к модели с другого контроллера в Ember

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 не модель и не может быть сохранен в магазине с 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; 
    } 
}); 

Я пытался нужен доступ к записи пользователя из главы контроллера:

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

Однако пользователь по-прежнему не доступны.

Я понял, что мой синтаксис неверен. Я был бы очень признателен, если бы кто-нибудь мог указать мне правильный способ доступа к записи пользователя таким образом, чтобы его можно было модифицировать и сохранить с контроллера Chapters.

Маршрут Chapters не вложен в маршрут пользователя, потому что шаблоны не вложены. Должен ли я вложить заголовок маршрута в пользовательский маршрут, даже если шаблоны не вложены в использование ModelFor()?

ответ

1

Если вы пытаетесь получить доступ к определенной записи из модели главы, вы можете сделать это с помощью this.store.find('chapter', record_id) с контроллера, так как store доступен для всех контроллеров (и маршрутов).

Если вам нужно создать новую запись главы с контроллера, вы можете сделать this.store.createRecord('chapter'), и она даст вам пустую запись для работы.

В этом случае не нужно вводить модель напрямую.

+0

И как эта модель сохраняется после этого? –

1

Вы должны иметь возможность вводить свой объект сеанса всем своим контроллерам и/или маршрутам. Затем вы сможете получить доступ к нему, где вам это нужно.

Внутри сеанса создайте свойство, называемое пользователем, которое загрузит пользователя (возможно, используя код, который вы указали на маршруте), соедините все с «session.user» в вашем контроллере, и вам должно быть хорошо идти.

Что касается вашего вопроса о маршрутизации, да, если вы хотите загрузить модель пользователя с маршрута, этот маршрут должен быть загружен. Либо как корневой маршрут, либо внутри дерева маршрутов.

Смежные вопросы