1

这是一个简单的例子

MyApp.ApplicationController = Ember.Controller.extend({
  content: "some @user",
  parsedContent: function() {
    return this.get("content").replace("@user", "<a {{action gotoUser 'user'}}>user</a>");
  }.property("content")
});

这将输出

some @user
some <a {{action gotoUser 'user'}}>user</a>

而不是将内容解释为 Handlebars 模板。我想我需要手动编译这个,但我不确定如何传递正确的上下文。

这是一个 JSFiddle

4

1 回答 1

2

我在这里有一个工作示例。基本上,通过使视图的模板成为计算属性,您可以在将模板传递给 Handlebars 解析器之前对其进行修改。

MyApp.LinkedUsersView = Ember.View.extend({
    template: function() {
        template = this.get("content").replace(/@(\w+)/g, '{{view MyApp.UserLinkView username="$1"}}');
        return Ember.Handlebars.compile(template);
    }.property()
});

MyApp.UserLinkView = Ember.View.extend({
    tagName: "span",
    user: function() {
        return MyApp.User.findByUsername(this.get('username'));
    }.property(),
    template: Ember.Handlebars.compile('<a {{action goToUser view.user href=true}}>@{{view.username}}</a>')
}); 

{{view MyApp.LinkedUsersView content="some @user with @another_user"}}

我不确定每次编译 Handlebars 模板的性能。

于 2012-12-25T04:31:44.323 回答