未捕获的错误:没有处理动作' createTodo'

时间:2014-05-01 07:16:02

标签: javascript ember.js handlebars.js

我正在使用Ember's Getting Started Guide创建TodoMVC。即使我严格按照说明操作,我仍然坚持creating a new model instance

当我输入一个新的待办事项并点击回车时,我得到以下控制台输出:

  

未捕获错误:没有处理动作'createTodo'。如果您确实处理了该操作,则可以通过从控制器中的操作处理程序返回true来导致此错误,从而导致操作冒泡。 ember.min.js:18

我的js/controllers/todos_controller.js看起来像这样:

Todos.TodosController = Ember.ArrayController.extend({
  actions: {
    createTodo: function() {
      // Get the todo title set by the "New Todo" text field
      var title = this.get('newTitle');
      if (!title.trim()) { return; }

      // Create the new Todo model
      var todo = this.store.createRecord('todo', {
        title: title,
        isCompleted: false
      });

      // Clear the "New Todo" text field
      this.set('newTitle', '');

      // Save the new model
      todo.save();
    }
  }
});

有什么想法吗?

更新

将我的代码放在JSFiddle中确实有效:http://jsfiddle.net/narzero/7926x/5/。我不明白为什么。

我正在使用Mac OSX 10.9.1。

5 个答案:

答案 0 :(得分:3)

如果有人仍在寻找答案。我遇到了与上述问题相同的问题。

我有自己安装的ember应用程序。它提供了一个app.js文件:

var TodomvcEmber = window.TodomvcEmber = Ember.Application.create();

/* Order and include as you please. */
require('scripts/controllers/*');
require('scripts/store');
require('scripts/models/*');
require('scripts/routes/*');
require('scripts/views/*');
require('scripts/router');

注意到在我的.tmp / scripts / combined-scripts.js文件中添加了我在/scripts/controllers/todos_controller.js中添加的控制器,其中没有集成。 在app.js文件中,我更改了require的顺序(将控制器的需求稍微向下)

var TodomvcEmber = window.TodomvcEmber = Ember.Application.create();

/* Order and include as you please. */
require('scripts/store');
require('scripts/models/*');
require('scripts/controllers/*');
require('scripts/routes/*');
require('scripts/views/*');
require('scripts/router');

这对我有用。

答案 1 :(得分:1)

ember无法找到动作处理程序的事实表明你的应用程序中没有 TodosController 。确保 /js/controllers/todos_controller.js 在文档中正确引用并由浏览器加载。

答案 2 :(得分:0)

我遇到了同样的问题,对我而言,原因是我没有在todos_controller.js中正确包含index.html

<script src='js/controllers/todos_controller.js"></script>

我没有意识到我曾使用'"来包装路径。快速修复:

<script src="js/controllers/todos_controller.js"></script>

答案 3 :(得分:0)

我正在关注ember cli - 现在有同样的问题......正如Saarang指出的那样“事实上,ember未能找到动作处理程序,表明你的应用程序中缺少TodosController。”

所以事实证明,我没有生成'todos controller'(复数),而是'todo controller' - 所以ember找不到具有正确名称的控制器

答案 4 :(得分:0)

我遇到了类似的问题,发现 Grunt (在我的情况下)实际上没有重新加载我所做的更改。重启Grunt有助于摆脱错误。

对所发生事件的简要描述:

我使用 Yeoman 生成了应用程序框架,并为应用程序添加了基本更改

 $ grunt serve

在此之后,我将一个新的控制器名称index_controller.js(app / scripts / controllers / index_controller.js)添加到controllers文件夹中的应用程序中并命名并注册了一个操作

MyApp.IndexController = Ember.Controller.extend({
  actions: {
   viewFruit: function(fruit) {
     console.log('hang on I"m viewing: ' + fruit.name);
   }
 }

});

应用/模板/ index.hbs

  <div>
    <h3>Fruits</h3>
    <ul>
      {{#each MyApp.fruits}}
       <li><a {{action 'viewFruit' this}} href="#">{{name}}</a></li>
      {{/each}}
    </ul>
  </div>

现在单击控制台上的水果名称会提示第一篇文章中报告的错误。

在阅读@ jana的答案后,我打开了我的.tmp/scripts/combined-scripts.js,发现注册的操作更改不存在于combined-scripts.js中。

因此我终止$ grunt serve并重新启动它并点击水果名称链接正确地将所需的消息记录到控制台。