Ember"在(动作)中传递的动作为空或未定义"错误

时间:2017-07-26 02:14:00

标签: javascript ember.js

我有一个Ember组件checkout-form,其中包含一些用于处理结帐过程的逻辑。这是我如何使用它的简化版本:

{{#checkout-form}}

  {{#each model.courses.otherDates as |date|}}
    {{course-date model=date selectDate=(action selectDate) }}
  {{/each}}

{{/checkout-form}}

在我的checkout-form.js组件内部,我有以下操作:

selectDate(day) {
  this.set("startAt", day.get("serverString"))
}

最后在我的course-date.js组件内部:

click () {
  const courseStart = this.get('courseStart')
  this.get('selectDate')(courseStart)
}

但是,运行此代码时出现错误:

ember.debug.js:19818 Assertion Failed: Action passed is null or undefined in (action) from <site@controller:checkout/date::ember389>.

我在这里缺少什么?我将操作传递给course-date组件并且不确定它为什么要求控制器?

1 个答案:

答案 0 :(得分:3)

错误原因是,
您正在访问该范围内未定义的selectDate(即控制器)如果您在该结帐表单中执行了{{log 'selectDate value is ' selectDate}}将打印selectDate value is undefined。因此,如果要访问任何属性,在组件中定义的操作,那么该组件应该产生这些值。

以下是twiddle which demonstrates如何从组件中产生动作。

application.hbs

{{#checkout-form as |selectDate| }}
 {{!-- 
 here context is controller not the checkout-form component
 Whatever you want to access from component, then component should yield those values.
 --}}
 {{course-date selectDate=(action 'selectDateInController')}}
 {{course-date selectDate=selectDate}}
{{/checkout-form}}

的application.js

import Ember from 'ember';
export default Ember.Controller.extend({
  appName: 'Ember Twiddle',
  actions:{
    selectDateInController(){
      console.log(' selectDate in controller');
    }
  }
});

templates / components / checkout-form.hbs - 这里我们正在产生selectDate动作

{{yield (action 'selectDate')}}

组件/结帐form.js

import Ember from 'ember';

export default Ember.Component.extend({
   actions:{
    selectDate(){
      console.log(' selectDate in checkout-form component');
    }
  }
});

course-date.hbs - 这里我们只使用传递给该组件的闭包动作。

<button {{action selectDate}}> CourseDate </button>