Ember.js Ember TypeError:调用控制器func时不支持的内容

Ember.js Ember TypeError:调用控制器func时不支持的内容,ember.js,Ember.js,所以我对余烬还很陌生,遇到了一个TypeError异常,说“不受支持的内容”,并且能够找到很少的文档/内容,通常是关于余烬的原因。触发此异常的是试图从模板中的控制器调用函数 routes/dashboard.js export default Ember.Route.extend({ model: function(params){ return ['Chart1', 'Chart2', 'Chart3'] }, setupController: function(contr

所以我对余烬还很陌生,遇到了一个TypeError异常,说“不受支持的内容”,并且能够找到很少的文档/内容,通常是关于余烬的原因。触发此异常的是试图从模板中的控制器调用函数

routes/dashboard.js

export default Ember.Route.extend({
  model: function(params){
    return ['Chart1', 'Chart2', 'Chart3']
  },
  setupController: function(controller, charts) {
    controller.set('charts', charts);
  }
});
export default Ember.ArrayController.extend({
  something: function() {
    return 'something!';
  }
});
控制器/dashboard.js

export default Ember.Route.extend({
  model: function(params){
    return ['Chart1', 'Chart2', 'Chart3']
  },
  setupController: function(controller, charts) {
    controller.set('charts', charts);
  }
});
export default Ember.ArrayController.extend({
  something: function() {
    return 'something!';
  }
});
dashboard.hbs

{{#each chart in charts}} 
  <div class='widget well'>
    {{ chart }}
  </div>
{{/each}}
{{something}} 
{{{#图表中的每个图表}
{{chart}}
{{/每个}}
{{something}}

虽然模板可以成功地在传入的数组上循环,但尝试调用函数“something”会引发错误并阻止加载模板。你知道我搞砸了什么吗?

使用computed属性应该可以解决这个问题:

export default Ember.ArrayController.extend({
  something: Ember.computed(function() {
    return 'something!';
  })
});
计算属性是Ember中需要理解的核心概念。它们由您必须提供的函数支持,并缓存返回值

您试图做的不是使用computed属性,而是显示一个
函数
。HTMLBars中不支持它,它将引发
TypeError

未捕获类型错误:不支持的内容

为什么呢?这是因为底层的HTMLBars逻辑。它检查您试图显示的内容的类型:

var type = typeof content;
然后,根据类型,它选择在DOM中显示值的正确方法:

switch (type) {
      case 'string':
        if (this.parseTextAsHTML) {
          return this.domHelper.setMorphHTML(this, content);
        }
        return this.setText(content);
      case 'object':
        if (typeof content.nodeType === 'number') {
          return this.setNode(content);
        }
        /* Handlebars.SafeString */
        if (typeof content.string === 'string') {
          return this.setHTML(content.string);
        }
        if (this.parseTextAsHTML) {
          return this.setHTML(content.toString());
        }
      /* falls through */
      case 'boolean':
      case 'number':
        return this.setText(content.toString());
      default:
        throw new TypeError('unsupported content');
}

正如您所看到的,
函数没有任何理由
,它会一直运行到
默认处理程序。您不能以这种方式显示
函数
,因为Ember不知道是应该先执行它并显示函数的结果还是显示函数体。

ArrayController已被弃用。此外,每个帮助器的语法也已更改。现在应该使用block paramsDon,不要忘记指定任何必需的依赖项keys@Daniel,你能解释一下你建议的解决方案吗?我不知道是什么原因导致了这个错误。谢谢