我正在研究如何使用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?
答案 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}}