从同一个哈希中引用RSVP哈希

Jor*_*dan 1 hash ember.js

我试图在同一条路线上加载两个不同的模型,我发现了一个堆栈溢出,解释了我可以Ember.RSVP.hash()用来完成这个,这就是我为使其工作所做的.

model: function(params) {
    return Ember.RSVP.hash({
        flyer: this.store.find('flyer', params.flyer_id),
        images: this.store.find('image', '-Jrgar1tSArUw-_PiJqX')
    });
},
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已经硬编码了我需要加载的图像记录的ID,这应该来自返回的传单,就像这样 flyer.imagesID

但是当我这样做时,我在控制台中出现错误,这是堆栈跟踪...

Error while processing route: flyers flyer is not defined ReferenceError: flyer is not defined
    at model (http://localhost:4200/assets/flyer-creator.js:338:38)
    at EmberObject.default.extend.deserialize (http://localhost:4200/assets/vendor.js:32872:19)
    at applyHook (http://localhost:4200/assets/vendor.js:55667:32)
    at Object.HandlerInfo.runSharedModelHook (http://localhost:4200/assets/vendor.js:53668:22)
    at Object.subclass.getModel (http://localhost:4200/assets/vendor.js:53894:21)
    at __exports__.bind (http://localhost:4200/assets/vendor.js:55536:19)
    at tryCatch (http://localhost:4200/assets/vendor.js:55993:16)
    at invokeCallback (http://localhost:4200/assets/vendor.js:56005:17)
    at publish (http://localhost:4200/assets/vendor.js:55976:11)
    at http://localhost:4200/assets/vendor.js:37026:7
Run Code Online (Sandbox Code Playgroud)

有没有办法访问从下一个属性的哈希返回的flyer属性?

art*_*ych 5

Ember.RSVP.hash()最好避免编码实际的promise命令.当订单很重要时,您可以使用承诺链.

model: function(params) {
   var self = this;
   return this.store.find('flyer', params.flyer_id).then(function(flyer) {
     return Ember.RSVP.hash({
       flyer: flyer,
       images: self.store.find('image', flyer.get('imagesID'))
     });
   });
},
Run Code Online (Sandbox Code Playgroud)

在您的特殊情况下,您使用route dynamic param params.flyer_id,因此更好的方法:

  • 解决flyer模型钩子,
  • images根据模型解析afterModel钩子.

原因是当您将传单模型直接传递给路线{{link-to 'flyer' 'flyer' flyer}}或时,模型挂钩不会被触发transitionTo('flyer', flyer).

model: function(params) {
  return this.store.find('flyer', params.flyer_id);
},

afterModel: function(flyer) {
  var self = this;
  // flyer is model already resolved
  return this.store.find('image', flyer.get('imagesID')).then(function(images) {
     var controller = self.controllerFor( self.get('controllerName') );
     controller.set('images', images);
     // or 2 steps: 
     // 1) self.set('images', images) here
     // 2) implement setupController hook, it has controller as param 
  });
}
Run Code Online (Sandbox Code Playgroud)

PS如果flyer belongsTo image你可以使用诺言

flyer.get('image')
Run Code Online (Sandbox Code Playgroud)

代替

this.store.find('image', flyer.get('imageID'))
Run Code Online (Sandbox Code Playgroud)