2016-11-16 5 views
1

Я новичок в Ember, поэтому мой подход может быть неправильным. Я использую последнюю версию Ember 2.9.1Emberjs 2.0+ обновить модель маршрута с новыми данными из магазина (createRecord)

Мой план состоит в том, чтобы обновить модель маршрута и заставить все компоненты визуализировать вновь добавленный/сохраненный элемент в коллекции.

(Я хочу, чтобы обновить модель моего маршрута (UserRoles массив) с новым рекордом UserRole после того как я называю СОХРАНИТЬ (на createRecord)).

До сих пор у меня есть маршрут, который имеет модель так:

model(){ 
    // this is my "user.edit" route 
    let user = this.modelFor('user'); 
    let newUserRole = this.get('store').createRecord('userRole'); 
    newUserRole.set('user_id', user.get('id')); 

    return RSVP.hash({ 
    user: user, 
    userRoles: store.query('userRole', { user_id: user.get('id') }), 
    roles: store.findAll('role'), 
    newUserRole: newUserRole 
    }); 
} 

Я тогда контроллер и несколько компонентов, которые модифицируют newUserRole. В пути у меня есть действие для сохранения новой роли пользователя:

actions: { 
    saveNewUserRole: function() { 
    let currentModel = this.modelFor('user.edit'); 
    currentModel.newUserRole.save().then(function (newUserRole) { 
     currentModel.userRoles.addObject(newUserRole); 
    }); 
    } 
} 

Что интересно, что новый товар (newUserRole) добавляется в коллекцию, но в консоли протоколирование модели говорит мне о том, что новый объект в отличие от других объектов в коллекции. Просматривая аналогичные вопросы для уголька Я считаю, что люди используют: _internalModel или ToArray(): (?) here и here или услуги для хранения/обновления данных.

(также изменен с помощью pushObject в AddObject (v1.3 +), а также наблюдатели прислушиваясь UserRoles изменения не получают сработавших внутри компонентов, или если я позвоню ToArray() I get 'Недопустимое значение, используемое как ошибка слабой карты ")

Вопрос: Каков правильный/Яркий способ обновить модель моего маршрута новым элементом и вызвать повторный рендеринг моего шаблона. Если я должен использовать службы для данных, должен ли сервис хранить все элементы в toArray() или POJO?

ответ

1

ember-data будет выполнять большую часть уродливых отношений для вас автоматически.

Так, например, вы никогда не должны делать что-то вроде этого:

newUserRole.set('user_id', user.get('id')); 

, но всегда это:

newUserRole.set('user', user); 

На .save()ember-data достаточно умна, чтобы сохранить идентификатор.

Кроме того, это выглядит как you'r пытается загрузить все userRole с для данного пользователя:

store.query('userRole', { user_id: user.get('id') }), 

Вы должны использовать только query при необходимости.Для того, чтобы принести отношения просто получить доступ к соотношению:

user.get('roles'), 

предположил, что вы имеете roles: hasMany('userRole') в вашем models/user-role.js.

Рядом с currentModel.userRoles.addObject вы изменяете массив результатов из данных ember. Вы должны сделать это только в том случае, если хотите изменить отношения. ember-data автоматически синхронизирует ваши отношения. Итак, после того, как вы установили user на userRole, новая роль будет автоматически передаваться в живом массиве, возвращаемом user.get('roles'). Так на самом деле вы должны never изменить массив, возвращаемый .query().

Так в основном это может быть ваш model крюк:

// this is my "user.edit" route 
let user = this.modelFor('user'); 
let newUserRole = this.get('store').createRecord('userRole', { 
    user 
}); 

return RSVP.hash({ 
    user, 
    userRoles: user.get('roles'), 
    roles: store.findAll('role'), 
    newUserRole, 
}); 

И это может быть ваш сохранить действия:

actions: { 
    saveNewUserRole: function() { 
    let currentModel = this.modelFor('user.edit'); 
    currentModel.newUserRole.save(); 
    } 
} 

Однако, если вы хотите, чтобы показать новую роль после того, как вы вы сохранили его, вы, вероятно, должны фильтровать по isNew=false при их просмотре. Пользователь имеет свойство компьютера, например userRolesFiltere: Ember.computed.filterBy('model.userRoles', 'isNew', false), или {{#unless role.isNew}}.

+0

Большое спасибо за этот ответ. Таким образом, я пытаюсь настроить страницу прямо сейчас. Однако я не могу сделать «user.get (« role »)« вызов, чтобы на самом деле сделать запрос на сервер. – GogromaT

+0

... или, вернее, мне нужно вернуть идентификаторы роли как часть вызова пользователю? Я использую REST Adapter, и если я не верну {role: [role_ids]} как часть пользователя, ember не будет делать отдельный запрос (ы) для данных – GogromaT

+1

, вы должны [указать ссылку] (http: //emberjs.com/api/data/classes/DS.RESTAdapter.html#method_findBelongsTo). – Lux

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

  • Нет связанных вопросов^_^