Ember.js 余烬模板将函数呈现为字符串

Ember.js 余烬模板将函数呈现为字符串,ember.js,handlebars.js,Ember.js,Handlebars.js,我是ember的新手,在模板方面遇到了问题 我的路线 import Ember from 'ember'; import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin'; export default Ember.Route.extend(AuthenticatedRouteMixin, { model: function(params) { var pageNum =

我是ember的新手,在模板方面遇到了问题

我的路线

import Ember from 'ember';

import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin, {
  model: function(params) {

    var pageNum   = params.page || 1,
        pageRows  = 8;

    return this.store.find('account', {
      page: pageNum,
      rows: pageRows
    });
  },

  setupController: function(controller, model) {
    controller.set('model', model);
    controller.set('greeting', 'Hello World');
  }
});
{{ greeting }}
{{ contentLength }}
我的控制器

import Ember from 'ember';

export default Ember.ArrayController.extend({
  contentLength: function() {
    // console.log(this);
    // console.log('length: ' + this.get('content').length);
    // return this.get('content').length;
    return 'Test string';
  },

  actions: {}
});
模板

import Ember from 'ember';

import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin, {
  model: function(params) {

    var pageNum   = params.page || 1,
        pageRows  = 8;

    return this.store.find('account', {
      page: pageNum,
      rows: pageRows
    });
  },

  setupController: function(controller, model) {
    controller.set('model', model);
    controller.set('greeting', 'Hello World');
  }
});
{{ greeting }}
{{ contentLength }}
{{greeting}}被正确呈现。但是{{contentLength}}作为字符串函数呈现出来

Hello World function () { // console.log(this); // console.log('length: ' + this.get('content').length); // return this.get('content').length; return 'Test string'; }
谁能帮我解决这个问题


谢谢

您需要在
contentLength
函数的末尾添加
.property()
,以便在模板中显示它:

import Ember from 'ember';

export default Ember.ArrayController.extend({
  contentLength: function() {
    // console.log(this);
    // console.log('length: ' + this.get('content').length);
    // return this.get('content').length;
    return 'Test string';
  }.property(),

  actions: {}
});
如果希望在控制器的另一个属性发生更改时更新该属性,只需将其添加为属性的“参数”,如
.property(“thepropertytoobserve”)
,并且arrayController的length属性在模板中已可用为
{length}


有关computerd属性的详细信息,请查看。

您可以在模板中使用
{{length}
,因为ArrayController已经具有该属性

contentLength
函数未执行所需操作的原因是它不是计算属性。您需要在
contentLength
函数中使用
Ember.computed(function(){..})
或附加
.property(…)

例如:


谢谢它起作用了。我有点沮丧,你不能只添加自定义的东西来显示在模板中。但也许我只是在错误的地方定义它?无论如何,添加.property('modelName')似乎就可以了。谢谢。你能解释一下为什么会有这种行为吗?对我来说,这似乎违反直觉。但这可能只是我对余烬的有限理解,这是为了区分计算属性和余烬对象函数。计算出的属性为优化添加了一些缓存。第一次呈现属性时执行函数,第二次仅从缓存返回信息,除非观察到的值之一发生更改。我建议您在计算属性和ember文档中的观察者上检查文档,这是ember中的一些强大机制