3

如何在自定义元素中注册 PolymerExpression 过滤器?我正在使用 Polymer.dart。

我想用这个:

<div>Uppercase: {{bob.fullName | uppercase}}</div>

在我的自定义元素的模板中。我在哪里注册uppercase

4

3 回答 3

3

我尝试了 Seth 的答案,并且表达式本身正在起作用,但不知何故,我正在丢失组件上的事件。当我使用时,我的on-click事件不再起作用:

  DocumentFragment instanceTemplate(Element template) =>
      template.createInstance(this,
          new PolymerExpressions(globals: {
            'uppercase': (String input) => input.toUpperCase()
  }));

我还尝试了聚合物表达式页面上提出的解决方案,但绑定委托显然丢失了。可能是因为新版本?

无论如何,在查看了代码之后,我发现了另一种表达表达式并保持事件正常工作的方法。

class MyElement extends PolymerElement {

  MainElement.created() : super.created();

  @override
  BindingDelegate syntax = new MyPolymerExpressions();
}

class MyPolymerExpressions extends PolymerExpressions {

  MyPolymerExpressions(): super(globals: {
      'uppercase': (String input) => input.toUpperCase()
  });

  @override
  prepareBinding(String path, name, node) => Polymer.prepareBinding(path, name, node, super.prepareBinding);
}

我注意到事件正在工作,该prepareBinding方法被覆盖。

如果有人有更好的方法或对此有一些想法,我很感兴趣!

于 2014-02-20T23:32:45.223 回答
2

在里面PolymerElement,覆盖instanceTemplate

  DocumentFragment instanceTemplate(Element template) =>
      template.createInstance(this,
          new PolymerExpressions(globals: {
            'uppercase': (String input) => input.toUpperCase()
          }));

请注意,您必须创建一个实例PolymerExpressions并注册过滤器。然后你必须打电话template.createInstance

于 2013-09-21T19:24:38.207 回答
1

对 dart-misc 的讨论中,聚合物表达式正在寻找一个接受单个参数的返回值。因此,要重现toFixed 参数示例,您需要从过滤器返回一个函数:

class MyElement extends PolymerElement {

  MainElement.created() : super.created();

  String toFixed(int digits) => (num n) => n.toStringAsFixed(digits);
}

此外,从polymer_expressions中,您不再需要执行自定义绑定/委托来使用表达式过滤器:“Polymer Expressions 现在是自定义元素的默认语法。” 看来您可以将函数目录添加到元素并将其用作过滤器。

于 2014-08-05T21:39:29.620 回答