0

渲染后如何在 Meteor 模板中大写小 a?

我尝试了什么:

Meteor 的LiveRange对象有一个visit()方法。有了它,我可以访问模板的所有渲染 DOM 节点。对于每个 DOM 文本节点,我在访问者中修改其数据。

然而!如何获取LiveRange模板的对象?

rendered()在模板的回调中this是模板实例。它LiveRange在一个名为_spark_kEezuQToKtbuQw3Xw或类似的成员中有一个对象。这看起来像 Meteor 不喜欢某人访问此成员。

我怎样才能LiveRange以让流星神高兴的方式获得模板的对象?

在你问为什么我会做这样一件愚蠢的事情之前,把所有的“a”都大写:这很复杂。实际上,我想在模板中的所有 DOM 文本节点上执行搜索和替换,因为我试图将横切关注点应用于 Meteor 应用程序中的多个模板。

4

1 回答 1

1

您对 a 在模板中的位置有任何限制吗?

例如,这是您将模板中所有 SPAN 中的所有 a 大写的方式:

Template.complicated.rendered = function() {

    this.findAll('span').each(function(idx, element) {
        $(element).html( $(element).html().replace(/a/g, 'A');
    });

};

 


 

如果要遍历所有顶级节点,可以这样做:

Template.complicated.rendered = function() {
  var node = this.firstNode;

  while(true) {

    // manipulate with node
    //
    // for example, get all text nodes within in
    // and replace a's with A's

    if(node === template.lastNode) return;
    node = node.nextSibling;
  }
}

但是,您需要小心使用此方法,并且只替换叶节点的内容。如果你改变每一个a,你可能会改变你不想改变的链接网址。此外,更改所有 DOM,而不仅仅是文本节点的内容,可能会激怒 Meteor 之神。

 


 

EDIT: Combined with How do I select text nodes with jQuery? , this code will upcase all a's in all text nodes within the template:

Template.complicated.rendered = function() {
  var node = this.firstNode;

  while(true) {

    _.each(getTextNodesIn(node, false), function(textNode) {
      textNode.nodeValue = textNode.nodeValue.replace(/a/g, 'A');
    });

    if(node === template.lastNode) return;
    node = node.nextSibling;
  }
}
于 2013-07-10T20:05:15.107 回答