Emberjs:访问父路线模型,这是一个承诺(主要细节)

时间:2014-11-19 19:27:52

标签: ember.js master-detail

enter image description here

我在图像上有主 - 细节页面布局。我通过#/masters/:master_id app url。

访问此页面

路由定义如下:

App.Router.map(function() {
  this.resource('masters', { path: '/masters' }, function() {
       this.route('detail', { path: '/:master_id' });
  });
});

App.MastersRoute = Ember.Route.extend({
   model: function() {
       return App.DataStore.getData('/api/masters'); //returns Promise!
   },

   setupController: function(controller, model) {
      controller.set("content", model);
   }
});

App.MastersDetailRoute = Ember.Route.extend({
   model: function(params) {
      return this.modelFor("masters").find(function(item) {
          return item.get("id") == params.master_id;
      });
   }
});

模板:

<script type="text/x-handlebars-template" data-template-name="masters">
    <div id="masters-grid">
      {{#each master in model}}
         <div {{action "show" master}}>
            {{master.name}}
         </div>
      {{/each}}
    </div>
    <div id="detail">
       {{outlet}}
    </div>
</script>

<script type="text/x-handlebars-template" data-template-name="masters/detail">
   {{model.name}} <br />
   {{model.age}} <br />
   {{model.address}} <br />
</script>

点击网格中的母版时,我想在详细信息插座中显示其详细信息,我不想在更改母版选择时从API重新加载所有母版。

我的MastersDetailRoute模型存在问题,因为this.modelFor("masters")会返回undefined。我认为,这是由model钩子中的Promise返回引起的。任何想法或解决方法如何从“子路径”model钩子中的Masters模型或控制器访问一个项目?

1 个答案:

答案 0 :(得分:2)

我在这看到一些事情。

  • 在定义与路由名称具有相同URL的路由时,无需指定路径
  • 详细路线也应该是资源,因为它是由模型支持的路线
  • 在Masters路线中,返回一个承诺是正确的,并由ember原生支持。在承诺之前,路线不会得到解决。
  • 不需要设置控制器
  • 通常最好进行所需的api调用以获取详细路径中的单个记录。这仅在第一次加载页面时使用(如果是书签或来自书签)
  • 在您的母版模板中,您可以使用id而不是输入data-template-name,或者更好地使用ember-cli / brocolli或grunt来预编译模板
  • 为了防止在选择行时使用ember来帮助重新获取模型使用把手帮助链接到

{{#link-to 'masterDetail' master}} {{master.name}} {{/link-to}}

  • 只是为了澄清,使用link-to以这种方式将第二个参数中指定的对象作为模型传递给指定的路径(第一个参数)。在您的情况下,主设备现在将被设置为主详细路线的模型。
  • 在主人的详细信息中没有必要输入“模型”模板中的默认上下文(即“this”的值)是控制器,如果在控制器上找不到属性,它会在模型​​中查找它

希望这有帮助