我在路由器中定义了一条路由:
...
this.resource('cart', {path: 'my/cart'});
...
MyApp.CartRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('cart');
}
});
在我的CartController(ArrayController)中,我在一个动作中添加了这行代码(addToCart):
this.transitionToRoute('cart', this.get('model'));
在其他路线的模板中,我称之为行动:
<button {{action 'addToCart' product target='controllers.cart'}}>Add To Cart</button>
单击该按钮时,出现此错误:
Uncaught Error: More context objects were passed than there are dynamic segments for the route: cart
根据我的理解,Ember应该已经认识到我正在传递模型并跳过模型钩子,这就是我想要的。
这可以通过在我的路径定义中添加一个随机的,无用的动态段然后在我的CartRoute中定义序列化来解决。但是,如果有更好的方法,我宁愿这样做。
我是以错误的方式解决这个问题吗?
答案 0 :(得分:0)
在
this.transitionToRoute('cart', this.get('model'));
您正在向没有动态细分的路线cart
发送一些数据对象。错误消息应该随行
this.transitionToRoute('cart');
那就是说,我有一种感觉,你的应用程序的架构可能是可以改进的。但我需要更多代码才能确定。无论如何,你应该看看是否将动作处理程序放在其他地方并使用冒泡动作而没有目标可能是一个选项。再一次,这只是一种感觉,我对你的代码知之甚少。
答案 1 :(得分:0)
游戏在这里有点晚了,但是听起来您可能想让购物车成为一种服务(/由该服务管理),而不是被当作一堆不同的特定路线的模型来获取。实际上,购物车是Ember docs页面上当前使用的具体示例,用于说明服务的使用:https://guides.emberjs.com/release/services/#toc_defining-services
这将使您可以在服务级别管理购物车的提取和本地缓存。然后,您可以将该服务直接注入到相关的控制器中,或者将服务注入到路由中,然后让路由返回服务管理的购物车对象作为其模型。