Ember.js 使用TransitionRoute,传递没有动态段的路由时,当前模型会导致错误

Ember.js 使用TransitionRoute,传递没有动态段的路由时,当前模型会导致错误,ember.js,Ember.js,我在路由器中定义了一条路由: ... this.resource('cart', {path: 'my/cart'}); ... MyApp.CartRoute = Ember.Route.extend({ model: function(params) { return this.store.find('cart'); } }); 在我的CartController(ArrayController)中,我在操作(addToCart)中有以下代码行: 在其他路

我在路由器中定义了一条路由:

...
this.resource('cart', {path: 'my/cart'});
...

MyApp.CartRoute = Ember.Route.extend({
    model: function(params) {
        return this.store.find('cart');
    }
});
在我的CartController(ArrayController)中,我在操作(addToCart)中有以下代码行:

在其他路线的模板中,我将该操作称为:

<button {{action 'addToCart' product target='controllers.cart'}}>Add To Cart</button>
据我所知,Ember应该意识到我正在向它传递一个模型,并跳过了模型挂钩,这正是我想要的

这可以通过向我的路由定义中添加一个随机的、无用的动态段,然后在我的CartRoute中定义serialize来解决。不过,如果有更好的办法,我宁愿这样做

我是不是走错方向了?

this.transitionToRoute('cart', this.get('model'));
您正在将一些数据对象发送到没有动态段的route
cart
。错误消息应随行一起消失

this.transitionToRoute('cart');

也就是说,我觉得应用程序的体系结构可能是可以改进的。但我需要更多的代码来确定。无论如何,您应该看看是否可以将操作处理程序放在其他地方,并在没有目标的情况下使用冒泡操作。同样,这只是一种感觉,我对您的代码了解不够,无法确定。

这里的游戏有点晚了,但听起来您可能希望您的购物车由一个服务(/由)管理,而不是作为一系列不同特定路线的模型获取。事实上,购物车是目前在Ember docs页面上解释服务使用的特定示例:


这将允许您在服务级别管理购物车的获取和本地缓存。然后,您可以将该服务直接注入到相关控制器中,或者将该服务注入到路由中,并让路由将服务管理的购物车对象作为其模型返回。

感谢您的快速回复。我希望将模型作为参数传递的原因是,我不希望它在每次转换时命中模型挂钩并执行GET/carts。在这种情况下,最好在模型钩子中为this.controllerFor('cart').get('model')添加一个检查,查看是否已经存在一个模型,并返回该模型,而不是返回this.store.find('cart')?回应您关于使用冒泡动作的建议:让余烬冒泡我的动作与告诉余烬我的目标动作在哪里相比,有什么好处?对我来说,使用target阅读和管理代码似乎要容易得多,因为您确切地知道调用该操作的位置。该操作也用于产品对象所在的应用程序的许多部分。如果您只想从存储中获取缓存数据,请查看
all
,而不是
find
。我需要它来
store.find
,当它第一次进入路由时。然后,当它返回到路由时,一个
存储。所有的
都可以,但我更希望它只获取已经是CartController模型的可变数组(从它第一次进入路由器时开始)。我发现冒泡操作更容易进行。目标可能在任何地方,所以我必须开始考虑结构。在路由树结构中,冒泡始终向上。
this.transitionToRoute('cart', this.get('model'));
this.transitionToRoute('cart');