Ember JS路由多个参数

时间:2014-03-10 20:23:49

标签: ember.js

我正在研究如何使用Ember JS,我遇到了一个问题。

我一直在开发一个非常简单的应用程序,允许用户从库中添加/编辑/删除书籍,然后根据标题或作者搜索书籍。基于此我试图创建一个链接到“/ search / title / adventures_of_huckleberry_finn”,这将告诉路由器过滤模型,以便它只返回标题等于“Huckleberry Finn历险记”的书籍(我知道我需要为字符大小写做一些字符串格式化并用URL的下划线替换空格,但我并不担心这个。)

我的模板中有以下链接(标题是硬编码以简化测试)

{{#link-to "books.search" "title" "adventures_of_huckleberry_finn"}}Search by title{{/link-to}}

我定义了以下路径(我怀疑我需要嵌套第二个动态段,但我不知道该怎么做,因为我不想要新的控制器/路由)

Books.Router.map(function () {
    this.resource('books', { path: '/' }, function () {
        this.route('search', { path: 'search/:search_by/:keyword' });
    });
});

<!-- ... additional lines truncated for brevity ... -->

Books.BooksSearchRoute = Ember.Route.extend({
    model: function (params) {
        return this.store.filter('book', function (book) {
            return book.get(params.search_by) == params.keyword;
        })
    },
    renderTemplate: function (controller) {
        this.render('books/index', { controller: controller });
    }
});

现在,如果我对BooksSearchRoute中的值或者:searchBy或:keyword parms进行硬编码,那么这样可以正常工作,但是当我尝试动态传递两个参数时,我会收到以下错误:

  

传递了更多上下文对象,而不是路径的动态细分:books.search

如何更新路线以便它允许我将两个动态参数正确传递到BooksSearchRoute?

1 个答案:

答案 0 :(得分:0)

这是一般概念,您实际上使用路线作为仅用于复合键的虚拟路线。就我个人而言,我仍然更喜欢用短划线或其他东西加入钥匙并使用单一路线,但是,嘿,这就是如何运作的。

App.Router.map(function() {
  this.resource('colorWrap', {path:'/:pk1'}, function(){
    this.resource('color', {path: '/:pk2'});
  });
});

App.ColorWrapRoute = Ember.Route.extend({
  model: function(params) {
    return {pk1:params.pk1};
  }
});

App.ColorRoute = Ember.Route.extend({
  model: function(params) {
    var wrapModel = this.modelFor('colorWrap');
    return $.getJSON('/colors/' + wrapModel.pk1 + '/' + params.pk2);
  }
});


{{link-to 'Click to see the red color!' 'color' 1 2}}

http://emberjs.jsbin.com/OxIDiVU/273/edit