【发布时间】: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(不确定我为什么要使用它,可能是遗留原因)。但我仍然想了解为什么我的助手会破坏更新链。