所以我对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;引发错误并阻止加载模板。我有什么想法搞砸了?
答案 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不知道它是应该先执行它还是显示函数的结果或显示函数体。