Ember.js 余烬嵌套路由

Ember.js 余烬嵌套路由,ember.js,ember-cli,Ember.js,Ember Cli,我有一个模型植物和一个相关的模型植物,应该有如下URL: /plants /plants/new /plants/some-plant-id/planting/new 添加植物的路线在url中工作,并显示正确的添加表单。问题是“随种植/新建操作提交”不起作用 控制台 ember.debug.js:19699 Uncaught Error: Nothing handled the action 'savePlanting'. If you did handle the action, thi

我有一个模型植物和一个相关的模型植物,应该有如下URL:

/plants
/plants/new
/plants/some-plant-id/planting/new  
添加植物的路线在url中工作,并显示正确的添加表单。问题是“随种植/新建操作提交”不起作用

控制台

ember.debug.js:19699 Uncaught Error: Nothing handled the action 'savePlanting'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.
我猜问题在于我在router.js中构建路由的方式,但不确定。只有一个控制器-app/controllers/application.js,这是最小的

这是我的一些代码

app/routes/planning/new.js

import Ember from 'ember';

export default Ember.Route.extend({

  model() {    
    return this.store.createRecord('planting');
  },

  actions: {

    savePlanting(newPlanting) {
      console.log("trying to save...");
      newPlanting.save().then(() => this.transitionTo('planting'));
    },

    willTransition() {
       //rollbackAttributes() removes the record from the store
       //if the model 'isNew'
      this.controller.get('model').rollbackAttributes();
    }
  }
});
路由器.js

...
this.route('plants', function() {
  this.route('new');
  this.route('edit', { path: '/:plant_id/edit' });

  this.route('planting',  { path: '/plants/:plant_id/planting' },   function(){
    this.route('new');
  });

});
...
顺便说一下,我的模板目录如下

app/templates/plants
app/templates/plants/new.hbs
app/templates/plants/planting/new.hbs  //plantings dir in plants
路由目录是

app/routes/plants
app/routes/planting

我做错了什么?

我认为您的问题是希望使用模板中的
路线中的操作

为此,应使用
route action
helper()


否则,它将在controller:)中查找操作。

我认为您的问题是希望使用模板中的
路由中的操作

为此,应使用
route action
helper()


否则,它将在controller:)中查找操作。

如果您看到用于将新设备保存到后端的ajax请求,那么也可能是由于某种原因导致该操作冒泡(这就是错误消息的第二部分所指)


您应该做的一件事是在操作处理程序
newplanning.save()
中返回承诺,并查看这是否会改变某些内容。另外,请向我们展示该操作从何处启动的模板。

如果您看到将新种植保存到后端的ajax请求,也可能是该操作随后以某种方式冒泡(这是错误消息的第二部分所指)


您应该做的一件事是在操作处理程序
newplanning.save()
中返回承诺,并查看这是否会改变某些内容。另外,请向我们展示操作从何处启动的模板。

在plants路线中保存plant效果很好。我只是学习余烬,我猜这应该是一个组件在未来无论如何。我创建了一个植树控制器文件,并将操作添加到该文件中,得到了相同的错误,因此我怀疑发生了其他事情。我认为最好是您可以准备简单但在本示例中“无法工作”的演示,以便我们可以在不进行猜测的情况下对其进行调查。我认为目录结构可能有问题。顺便说一句,你的路线目录应该是这样的吗?{plants.js,plants:{planning.js,planning:{new.js}}}将植物保存在植物路径中效果很好。我只是学习余烬,我猜这应该是一个组件在未来无论如何。我创建了一个植树控制器文件,并将操作添加到该文件中,得到了相同的错误,因此我怀疑发生了其他事情。我认为最好是您可以准备简单但在本示例中“无法工作”的演示,以便我们可以在不进行猜测的情况下对其进行调查。我认为目录结构可能有问题。顺便说一句,你的路线目录应该是这样的吗?{plants.js,plants:{planning.js,planning:{new.js}}}只需将{{this}}放在模板中,查看它试图使用的控制器,此外,还可以安装ember inspector,以便查看更好的调试路由模板和控制器,您将看到必要的命名约定等,并且更容易理解ember期望的内容和位置。Ember总是从controller->route中冒泡操作,如果您没有阻止它,如果发生错误,则在其中任何一个中都找不到该操作。将{{this}}添加到模板会给我(generated plants.planning.new controller),这从您所说的控制器冒泡到route的内容来看是有意义的。既然我没有为植物或种植创建控制器,我该怎么办?创建控制器?开始使用组件?如果我创建控制器,我将把包含savePlanting操作的控制器文件放在哪里?生成的文件显示它正在使用用于plants/planting/new的控制器,因此该操作应该位于匹配路径中。如果您将…plating/new命名为不同的名称,则会更加清楚(这将是另一个问题,路由名称应该是唯一的),所以“app/routes/planting/new.js”应该是app/routes/planting/new,如果路径显示为“generated route”,那么请检查ember控制台,这样您就知道文件是否丢失或需要生成,如果您通过命令行btw生成它们,那么简单得多。只需将{this}在您的模板中,您可以看到它试图使用的控制器,此外,还可以安装ember inspector,以便您可以看到更好的调试路由模板和控制器,您可以看到必要的命名约定等,并且更容易理解ember期望的内容和位置。如果您没有预先安装,ember总是从controller->route中弹出操作如果发生错误,则在其中任何一个中都找不到该操作。将{{{this}}添加到模板将为我提供(生成的plants.planning.new controller)这从你所说的控制器冒泡到路由是有道理的。因为我没有为植物或种植创建控制器,我该怎么做?创建控制器?开始使用组件?如果我创建控制器,我会将包含保存种植操作的控制器文件放在哪里?生成的文件显示它使用了t植物/种植/新建控制器,因此操作应在匹配路径中。如果您以不同的方式命名…plating/new(这将是另一个问题,路径名称应唯一),则“app/routes/plating/new.js”应为app/routes/plants/plating/new,如果路径显示为“generated route”,请检查余烬控制台因此,您知道如果文件丢失或需要生成,那么通过命令行btw生成它们会更简单。没有ajax请求…没有找到包含newPlanting.save的操作确实,我没有仔细阅读。查看从中触发操作的模板仍然会使