如何构建具有命名出口的多记录Ember应用程序?

时间:2014-01-28 06:33:44

标签: ember.js ember-router

我正在尝试构建一个类似Tweetdeck的UI,将中央图书馆的项目分类。我真的需要帮助围绕使用Ember路由器的规范方式。

基本上,我有一个搜索UI,允许用户同时打开零个或多个类别。类别显示项目列表,用户可以从右侧的中央库添加到这些项目。通过完全忽略路由器和URL,我设法破解了一个半工作的概念证明。现在我想回去尝试以Ember的方式去做。下面是我想要完成的高级草图:

enter image description here

如果我理解正确,所需的URL方案将是当前打开的模型ID的逗号分隔列表。我很清楚如何从另一个问题How to design a router so URLs can load multiple models?处理这个问题。

不幸的是,有一些我不理解的概念:

  • 如何构建我的模板和路由器,以便使用自己的模型和控制器显示库?我假设有一个名为{{outlet}}的方法,但我是在renderTemplate配置时完全丢失了。或者我应该使用{{render}}代替?在任何一种情况下,我都不了解路由器在这种情况下的作用。

编辑1/28 :我添加了 updated fiddle ,其中包含独立 library路由/模板和文档我尝试将其呈现到categories模板中。当我试图将它嵌入另一条路线时,Ember如何期望我将库模板作为模型?我已经尝试{{outlet}}renderTemplate{{render}},但在这两种情况下,我都会在指定模型时遇到困难。

使用renderTemplate

App.CategoriesRoute = Ember.Route.extend({
    renderTemplate: function() {
        this.render('categories');
        this.render("library", {
            into: "categories",
            outlet: "library",
            controller: "library",
        });
    },
});
  • 当我的控制器收到打开类别的请求时,如何将其传达给路由器?哈希路径如何更新?谁负责加载适当的模型?我假设我应该从transitionTotransitionToRoute开始,但我也不了解路由器的角色。具体问题:

    1. 如何从URL反序列化多个逗号分隔的模型?我只是分开逗号还是有更好的方法?

    2. 从网址获取ID后,如何让我的模型钩子返回多条记录?我只是将它们全部推入Ember阵列吗?

    3. 当控制器获取要打开的新记录的ID时,如何将其与路由器通信?

我试图自己解决这个问题并多次阅读Ember文档,但我担心它只是在我脑海中。我整理了一个 minimal (currently non-functional) fiddle 来概述我的想法并指出我被困在哪里。我很感激任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:0)

this.render不接受模型参数,但你可以通过控制器属性传递模型,这是有道理的,因为Controller实际上是模型的代理,无论如何

App.IndexRoute = Ember.Route.extend({
    var self = this,
        notesController = self.controllerFor('notes').set('content', self.store.find('notes'));

    renderTemplate: function() {
        this.render('notes', {
            controller: notesController,
            into: 'index',
            outlet: 'notes'
        });     
    }
});

答案 1 :(得分:-1)

You could also try something like this from this link.

App.IndexRoute = Ember.Route.extend({ model: function() { return Ember.RSVP.hash({ books: this.store.findAll('book'), genres: this.store.findAll('genre') }); }, setupController: function(controller, model) { controller.set('books', model.books); controller.set('genres', model.genres); } });

在这里,他们使用Ember.RSVP.hash将多个模型加载到一个路径中,然后使用setupController分别设置每个模型(Rails:实例变量?)。

我假设您使用此方法可以根据需要加载任意数量的模型。