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

时间:2015-09-27 21:17:43

标签: ember.js

所以我对Ember很新鲜,遇到了一个TypeError异常,说“不支持的内容'并且能够找到关于与Ember相关的原因的一般文档/内容。触发此异常的原因是尝试在模板中调用控制器中的函数...

路由/ dashboard.js

public sealed class UserStore<TUser> :
    IUserStore<TUser>,
    IUserPasswordStore<TUser>,
    IUserEmailStore<TUser>,
    IUserLoginStore<TUser>,
    IUserRoleStore<TUser>,
    IUserClaimStore<TUser>,
    IUserPhoneNumberStore<TUser>,
    IUserLockoutStore<TUser>,
    IUserTwoFactorStore<TUser>
   where TUser : SiteUser
{
.. implementation
}

控制器/ dashboard.js

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

dashboard.hbs

export default Ember.ArrayController.extend({
  something: function() {
    return 'something!';
  }
});

虽然模板可以成功循环传入的数组,但是试图调用函数&#39;引发错误并阻止加载模板。我有什么想法搞砸了?

1 个答案:

答案 0 :(得分:12)

使用computed属性可以解决问题:

export default Ember.ArrayController.extend({
  something: Ember.computed(function() {
    return 'something!';
  })
});

计算属性是Ember理解的核心概念。它们由您必须提供的功能支持,并且它们会缓存返回值。

您尝试做的是,而不是使用计算属性,显示function。它在HTMLBars中不受支持,并会引发TypeError

  

未捕获的TypeError:不支持的内容

为什么?这是因为底层的HTMLBars逻辑。它会检查您尝试显示的type内容:

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');
}

正如您所看到的 - function没有任何情况,它一直到default处理程序。你无法以这种方式显示function,Ember不知道它是应该先执行它还是显示函数的结果或显示函数体。