【问题标题】:Ember.js Handlebars block helperEmber.js Handlebars 块助手
【发布时间】:2013-08-06 19:12:54
【问题描述】:

显然这不起作用:http://jsbin.com/efapob/3/edit

Ember.Handlebars.registerHelper('foo', function(options) {
  var result = 'BEFORE '
           + options.fn(this)
           + ' AFTER';
  return new Handlebars.SafeString(result);
});

我认为这是因为 fn() 直接写入输出缓冲区。

但是,我需要一种方法来直接处理块内容的输出。

我尝试覆盖视图的 render 函数,但这也没有将我带到任何地方。

(背景:我正在尝试编写一个 {{#ifchanged}} 帮助程序块,该块仅在与上次调用相比内容发生更改时才呈现。用例是一个循环,每次模型的一个属性时都应该显示一些内容与上一个不同。如果您有其他想法如何实现这一点,cmets非常感谢!)

【问题讨论】:

  • 你在使用 ember-data 吗?
  • 是的。有意思,这怎么连接?
  • 因为可以使用 isDirty 属性,来知道某些属性何时发生变化。看看我的答案。

标签: ember.js handlebars.js


【解决方案1】:

如果有人感兴趣,在这个特定的用例中,我解决了无法使用 fn() 的返回的问题,如下所示:

var ifchanged_last;
Ember.Handlebars.registerHelper('ifchanged', function(property, options) {
  var value = Ember.Handlebars.get(this, property);
  if (value !== ifchanged_last) {
    options.fn(this, options);
  }
  ifchanged_last = value;
  return;
});

模板:

{{#each content}}
  {{#ifchanged some_key}}
    The value changed
  {{/ifchanged}}
{{/each}}

有很大的改进空间,但是一个可用的起点。

【讨论】:

    【解决方案2】:

    您可以使用DS.Model 中的isDirty 属性来了解数据何时发生变化。

    在某些模板中:

    {{#if isDirty}}
        You changed the model<br/>
    {{/if}}
    

    还有一个jsfiddle 与演示。

    【讨论】:

    • 谢谢,但我不想知道模型是否已更改,我只想知道一个属性是否与 {{each}} 中的最后一个属性不同循环。
    • 你有一个元素数组,那么在迭代中,如果当前元素的某些属性与前一个不同,你想知道吗?
    • 正是如此。我有一组具有“组”属性的项目,对于每个组,我想显示一行文本,但只显示一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多