在模型挂钩中获取异步hasMany关系

感觉

可以说我有两个模型,BookChapter

App.Book = DS.Model.extend({
  name: DS.attr(),
  chapters: DS.hasMany('chapter', { async: true })
});

App.Chapter = DS.Model.extend({
  name: DS.attr(),
  book: DS.belongsTo('book')
});

我正在使用RESTAdapter

App.ApplicationAdapter = DS.RESTAdapter;

IndexRoute比方说,我想获取的第一本书(ID = 1)和它的相关章节。由于该hasMany关系被标记为async: true,因此我想在呈现模板之前获取此关联。

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return Ember.RSVP.hash({
      book: this.store.find('book', 1)
    }).then(function(hash) {
      hash.chapters = hash.book.get('chapters');
      return hash;
    })
  },
  setupController: function(controller, model) {
    controller.set('model', model.book);
  }
});

我的索引模板仅显示书名,并遍历其章节。

<script type="text/x-handlebars" id="index">
  <h3>Book: {{name}}</h3>

  <ul>
    {{#each chapters}}
      <li>{{name}}</li>
    {{/each}}
  </ul>
</script>

使用mockjax时,我设置了模拟响应。

$.mockjax({
  url: '/books/1',
  responseText: {
    book: {
      id: 1,
      name: 'Book 1',
      chapters: [1, 2]
    }
  }
});

$.mockjax({
  url: '/chapters?ids[]=1&ids[]=2',
  responseText: {
    chapters: [{
      id: 1,
      name: 'Chapter 1',
      book_id: 1
    }, {
      id: 2,
      name: 'Chapter 2',
      book_id: 1
    }]
  }
});

问题1:根据RESTAdapter文档,访问book.get('chapters')应向发出GET请求/chapters?ids[]=1&ids[]=2但是,我的控制台显示了对/chapters/1和的两个独立请求/chapters/2

问题2:此外,我认为模板是章节请求发生之前呈现的因为模板是在我看到对/chapters/1的两个请求之前渲染了一两秒的/chapters/2如果我hash.book.get('chapters')从路由中删除对的呼叫,则会发生相同的问题。换句话说,我不认为路由正在发送请求,我认为模板是

这是一个jsbin您会注意到它没有显示任何章节,因为我还没有设置它请求的两条路线(/chapters/1/chapters/2)。

XLII

第一个问题的原因很简单:您使用的是Ember Data的Dev(Canary)版本,其行为与您可以在EmberJS网站上找到的beta版本不同。它是最前沿的,因此很难确定它是否已损坏或即将发生的变化。如果您希望行为与指南保持一致,我建议您使用最新的Beta版本(Ember Data尚未标记为稳定)。

至于第二个:这是您期望的行为,因为您将异步请求与Promises一起使用。这意味着,您将立即返回结果(无需等待任何内容),但是在解决异步请求之前,这些结果为

您可以包装这种行为,并(例如)仅在异步例程完成后才插入模板,但是我建议您重新考虑一下,因为根据个人经验,这不是常见的模式,并且您的应用很可能不需要它。

如果您对这些机制的确切工作方式感兴趣(您不需要它,仅是为了满足对此主题的潜在好奇心):

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在CodeIgniter挂钩中获取模型实例

Dexie更新挂钩中的异步更改

回送hasMany关系remoteMethod挂钩

确定全局挂钩中的Sequelize模型

灰烬数据批量获取异步hasMany关系记录

如何在异议模型的$ afterUpdate挂钩中获取整个更新的条目?

检索HasMany关系的模型

在created()生命周期挂钩中的vue异步调用

异步.map()在React挂钩中不起作用

Vue / Vuex在创建的挂钩中等待异步调度

检索在Objection ORM中的$ afterInsert挂钩中创建的模型的ID

通过ajaxSetup(Ember)在模型挂钩中设置标题

EmberJS hasMany 不获取关系

如何在“之前”挂钩中获取摩卡测试名称?

返回前从react挂钩中获取更新的变量

在“删除后”挂钩中获取数据库操作的状态

如何使用.NET从gitlab挂钩中获取推送信息

在新订单挂钩中获取订单数据

渲染之前在useEffect挂钩中获取数据-React

useEffect挂钩中的问题以在React.js中获取api

如何在安装挂钩中获取加入单元的IP地址?

在猫鼬预钩中获取模型计数

尚未加载Ember模型的“ hasMany”关系

Laravel 访问 HasMany 关系的 BelongsTo 模型

子路径(或资源)如何从模型挂钩中访问父资源的模型?

如何在Vue实例的beforeCreate挂钩中进行异步调用?

如何在带有thunk的react-redux挂钩中进行异步调用?

在before_relationship_add挂钩中看不到过去的关系

如何在TYPO3的挂钩中更新关系为1:n的对象