2017-01-19 8 views
1

Моей версии уголька:модель идентификатор пришел из другой модели, как я могу установить в маршруте по угольку

DEBUG: ------------------------------- 
Ember    : 2.10.2 
Ember Data  : 2.11.0 
jQuery   : 2.2.4 
Ember Simple Auth : 1.1.0 
Model Fragments : 2.3.2 
DEBUG: ------------------------------- 

И мой маршрут Код:

import Ember from 'ember'; 
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin'; 
import RSVP from 'rsvp'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    model() { 
    console.log(1); 
    return RSVP.hash({ 
     ..., 
     user: this.store.findRecord('user', this.get('session.data.authenticated.id')) 
    }); 
    }, 

    afterModel(model, transition) { 
    return this.store.findRecord('company', model.user.get('companyId')).then(company => { 
     console.log(2); 
     this.set('company', company); 
    }); 
    }, 

    setupController(controller, model) { 
    console.log(3); 
    controller.set('user', model.user); 
    controller.set('company', this.get('company')); 
    } 
}); 

Посмотрите на console.log кода, я думаю, правильный порядок должен быть 1-> 2-> 3. Но иногда это оказывается 1-> 3-> 2.

Но мой company id должен исходить от user api. Так каким образом я установил его в маршрут? Благодарю.

ответ

2

Я пишу только одно решение, от RSVP.hash api docs

Возвращает обещание, которое выполняется, когда все данные обещания были выполнены, или отвергнуто, если какие-либо из них становится отвергнуто. Возвращаемое обещание выполняется с хешем, который имеет те же самые имена ключей, что и аргумент объекта обещает. Если какое-либо из значений в объекте не обещает, они просто будут скопированы на выполненный объект.

Таким образом, вы можете написать ваши требования, как приведенный ниже код,

model() { 
     var promises = { 
      user: this.store.findRecord('user', this.get('session.data.authenticated.id')) 
     }; 
     return Ember.RSVP.hash(promises).then(hash => { 
      //then method will be called once all given promises are fulfilled, or rejected if any of them become rejected. 
      return this.store.findRecord('company', hash.user.get('companyId')).then(company => { 
       hash.company = company; // Here i am setting company property inside model itself, so you dont need to set it in route and carry over to controller 
       return hash; 
      }); 
     }) 
    } 

Примечание: Я хотел бы знать, если вы можете воспроизвести 1- поведение> 3-> 2 в уголек-вертеть.

2

На самом деле правильный способ сделать это, чтобы положить все ваши модели выборки в вашем model крючке:

model() { 
    return RSVP.hash({ 
    ..., 
    user: this.store.findRecord('user', this.get('session.data.authenticated.id')) 
    }).then(hash => { 
     hash.company = this.store.findRecord('company', hash.user.get('companyId')); 
     return RSVP.hash(hash); 
    }) 
}, 

setupController(controller, model) { 
    controller.set('user', model.user); 
    controller.set('company', model.company); 
} 
+0

Hi Lux ..пути пути моего ответ просто совпадающий :) – kumkanillam