【问题标题】:Ember.js/Emblem.js Uncaught Error: Nothing handled the event 'createUser'Ember.js/Emblem.js 未捕获的错误:没有处理事件“createUser”
【发布时间】:2013-11-07 21:00:49
【问题描述】:

我想我可能误解了 Ember 连接路由、视图和模板的方式,但我无法弄清楚,而以下导致错误:

未捕获的错误:没有处理事件“createUser”。

我的文件如下:

javascripts/router.js.coffee

App.Router.map ->
  @resource 'account', ->
    @route 'index', path: '/'

javascripts/routes/account_router.js.coffee

App.AccountRoutes = Ember.Route.extend
  model: -> App.User.find()

javascripts/controllers/account_controller.js.coffee

App.AccountController = Ember.ObjectController.extend
  createUser: ->
    App.User.createRecord
      field1: @get('field1')
      / etc

javascripts/views/account_view.js.coffee

App.AccountView = Ember.View.extend
  templateName: 'account'

javascripts/templates/account/index.emblem

form.form submit="createUser"
  / fields

【问题讨论】:

    标签: javascript ember.js coffeescript


    【解决方案1】:

    我认为您缺少 actions 哈希。

    模板内的操作,例如:

    <script type="text/x-handlebars" id="foo">
      <div {{action "doFoo"}}>Click here</div>
    </script>
    

    需要出现在相应的控制器或路由中,在动作对象内:

    App.FooController = Ember.ObjectController.extend({
      actions: {
        doFoo: function() {
          alert('Foo');
        }
        // ... more actions here
      }
    });
    

    在您的情况下,我认为您需要更新到以下内容:

    App.AccountController = Ember.ObjectController.extend
      actions:
        createUser: ->
          App.User.createRecord
            field1: @get('field1')
    

    【讨论】:

    • 谢谢,答案实际上是@rick 的建议,但我收到了弃用警告,通过按照您的建议将方法添加到操作对象来修复
    • 好眼Marcio,动作哈希也丢失了。在这里工作的小组编程。您收到@jonathan 的弃用警告(事件......某事)是因为当应用程序到达该控制器寻找 createUser 时缺少操作哈希。
    【解决方案2】:

    我不是咖啡师,但你的路线声明中有一个错字:路线应该是路线

    你说:

    App.AccountRoutes = Ember.Route.extend
      model: -> App.User.find()
    

    应该是:

    App.AccountRoute = Ember.Route.extend
     model: -> App.User.find()
    

    如果您尝试访问帐户资源的索引路由,则不必在路由器中明确定义它就在那里。因此,您将使用您的 AccountIndexController、AccountIndexRoute 和帐户/索引模板来访问它。

    【讨论】:

    • 来自 Rails 背景,我假设如果我定义了一个 AccountController,它下面的路由将能够从那里继承方法。我需要为每个模板重新定义一个新的控制器吗?
    • Ember 也像 Rails 一样使用命名约定来帮助您保留所有这些路由、控制器、模板、视图,这样您就可以记住彼此之间的关系。默认情况下,除非被您覆盖,否则 AccountController 将与您的 AccountRoute 关联,并且 Account(Template) 在 Account(Template) 中发生的事情将冒泡到 AccountController AccountRoute 并继续向上爬到应用程序级别。您不必为每个模板重新定义控制器,除非您正在为 Ember 用于控制器运行的默认行为添加功能。
    【解决方案3】:

    Coffeescript 对缩进非常敏感,可能会误解您的控制器。试试这个:

    App.AccountController = Ember.ObjectController.extend   
      createUser: ->
        App.User.createRecord
          field1: @get('field1')
          / etc
    

    【讨论】:

    • 抱歉,这实际上只是一个复制/粘贴错误,我已经编辑了我的问题以反映这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多