【问题标题】:Dynamic nature of templates broken by custom handlebars helper自定义车把助手破坏的模板的动态特性
【发布时间】:2014-10-07 15:09:23
【问题描述】:

我有这个辅助函数:

// You can insert directly html from a controller, by doing:
//   {{rawHtml formattedName}}
//   where formattedName is the name of the controller property returning the html
Handlebars.registerHelper('rawHtml', function(propName) {
    var html = this.get(propName);
    if(typeof html === 'undefined') {
        console.error('rawHtml > propName=%s can not be found. Using empty string for html', propName);
        html = '';
    }
    return new Handlebars.SafeString(html);
});

我在模板中使用这种方式:

<td>{{#link-to controller.showRoute this}}{{rawHtml formattedName}}{{/link-to}}</td>

formattedName 是一个计算属性:

SettingsApp.GenericModel = DS.Model.extend({

    'properties§name' : DS.attr('string'),

    formattedName: function () {
        var formattedName = this.get('properties§name') || SettingsApp.helpers.markText(config.lang.UNDEFINED_NAME, 'UNDEF');
        return formattedName;
    }.property('properties§name'),

    ...

});

这工作正常。但是有一个问题:每当在显示模板时商店中的数据发生变化(没有路由变化),模板都不会更新。在我的应用程序中,每当服务器(websockets)推送数据或触发手动/自动存储更新(用于测试)而不更改路由时,就会发生这种情况。

我已将问题范围缩小到 rawHtml 助手:如果我执行以下操作:

<td>{{#link-to controller.showRoute this}}{{formattedName}}{{/link-to}}</td>

模板更新好了。因此,存储运行良好,计算属性运行良好。

我想知道rawHtml 助手的问题出在哪里?它打破了什么样的更新链?如何修复它,使其不会破坏模板的动态特性?

编辑

根据guide

如果当前上下文的 name 属性发生变化,Ember.js 将 自动再次执行帮助程序并使用新的更新 DOM 价值。

但好像不是这样:formattedName 改变了,但是没有调用helper。我做错了什么?

【问题讨论】:

  • 与您的问题相关:您熟悉 Handlebars 内置的三括号语法吗?喜欢{{{formattedName}}}
  • 是的,我是,而且我可能会开始使用它而不是 rawHtml(不确定我为什么要使用它,可能是遗留原因)。但我仍然想了解为什么我的助手会破坏更新链。

标签: ember.js handlebars.js


【解决方案1】:

根据文档 (http://emberjs.com/api/classes/Ember.Handlebars.html#method_registerBoundHelper),您应该使用 Ember.Handlebars.registerBoundHelper 来获取此数据绑定。 registerHelper 默认是未绑定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多