0

我的 ember 路由器设置了这种类型的父/子资源。

 this.resource("cities", function(){
         this.resource("city", { path: ':city_id'});

    });

在后端(即 Rails)中,City.rb 和 Restaurant.rb 之间存在 has_many 关系,在 City 的 Active Model Serializer (AMS) 中,我还声明了与 Restaurants 的 has_many 关系。在 AMS 中,当声明关系时,它为您提供了执行此类操作的选项

embed :ids, include: true

所以只包括子模型(在我的例子中是餐厅)的“id”。我没有那样做。因此,当我对 City.rb 模型执行 findAll ajax 请求时,我会获取每个城市的所有 Restaurant 属性。这意味着在城市模板中,我可以显示每家餐厅的名称等,因为所有餐厅数据都在手边

 <script type="text/x-handlebars" id="city">

      {{ model.name }}//city name

      {{#each item in model.restaurants}}
      <li> 
      {{#link-to 'restaurant' item}}{{ item.name }}{{/link-to}}
     </li>
    {{/each}}

</script>

但是,我已经读到 Ember 中的最佳实践实际上只为儿童模型(在我的例子中是餐厅)嵌入 id embed :ids, include: true,这意味着餐厅名称在上述模板中不可用。

我的问题是,如果我这样做embed :ids, include: true,当我为每个城市显示模板时,只有现在有什么用id?这意味着我无法显示每个城市的餐厅列表,如果我想显示它们,我必须单独查询每个城市。

如果这是正确的,那么embed :ids, include: true在带有 Ember 的 Active Model Serializer 中使用的用例是什么。有没有办法在这种情况下使用它来提高代码效率?

代码

我的城市 findAll 方法

App.City.reopenClass({

  findAll: function() {

     return $.getJSON("cities").then(
      function(response) {    
        console.log(response);     
        var links = Em.A();
        response.cities.map(function (attrs) {
          links.pushObject(App.City.create(attrs));
        });
        console.log(links);
        return links;
      }
    );
   },

   });

城市模板_

<script type="text/x-handlebars" id="cities">

  <div class='span4'>
      {{#each item in model}}
      <li> {{#link-to 'city' item}}
      {{ item.name }} 
      {{/link-to }}</li>
    {{/each}}

         </ul>
     </div>

  <div class="span4 offset4">
   {{ outlet}}
   </div>

</script>

还显示餐厅的城市模板

<script type="text/x-handlebars" id="city">

      {{ model.name }} //city name

      {{#each item in model.restaurants}}
      <li> 
      {{#link-to 'restaurant' item}}{{ item.name }}{{/link-to}}
       </li>
      {{/each}}
</script>
4

2 回答 2

1

在此处阅读有关嵌入式关联的 AMS 文档,看起来就像embed: ids, include: true在加载的对象旁边使用侧加载数据。

这意味着,在您的情况下,您将收到如下信息:

cities: [
    {id: 1, name: 'Paris', restaurant_ids: [1, 3]},
    {id: 2, name: 'Houston', restaurant_ids: [2]}
],
restaurants: [
    {id: 1, name: 'Septime'},
    {id: 2, name: 'Unknown restaurant'},
    {id: 3, name: 'Le Reminet'}
]

所以你应该能够在没有任何进一步请求的情况下获取餐馆数据,与你最初描述的方式的唯一区别是餐馆数据不会直接嵌入到城市数据中。

来自 AMS 文档,

这使得处理整个数据包变得更加容易,而无需递归地扫描树以查找嵌入信息。

此配置的一个用例是将ActiveModelAdapter用于需要embed: ids, include: true正常工作的 Ember 数据。

于 2014-06-18T15:25:51.927 回答
0

我相信embed: ids通常在您使用 Ember Data 时使用。在 ED 中设置模型关系后,它将能够查看您提供的具有关系的 id 数组,并将它们侧面加载到需要该数据的模板中。

查看 Embers模型 (ED) 文档了解更多信息。

于 2013-09-13T19:57:06.913 回答