1

谁能指出我如何从流星助手访问原件。 TemplateInstance我知道,Template.instance()但它似乎返回调用助手的模板实例,而不是为其定义助手的模板实例。

假设我们有两个小模板:

<template name='demo'>
  <h1>{{helper}}</h1>
  {{# border}}
    <h2>{{helper}}</h2>
  {{/border}}
</template>

<template name='border'>
  <div style="border:1px solid red">
    {{> UI.contentBlock}}
  </div>
</template>

具有以下行为:

Template.demo.created = function() {
  this.result = "OK";
}

Template.demo.helpers({
  helper: function() {
    var tmpl = Template.instance();
    return tmpl.result || "FAILED";
  }
});

我希望为demo模板获得两个“OK”:第二个应该在红色边框中。但是由于 Template.instance()TemplateInstance仅当在其所有者模板的顶层调用助手时才返回原始结果,因此结果为“FAILED”(当然在红色边框中)。

问题:是否有任何公共api可以获取原始TemplateInstance(无需遍历view/parentView/_templateInstace)?

4

3 回答 3

0

我认为您的主要问题是您没有正确设置模板实例变量。试试下面的代码...

设置一个实例变量:

Template.instance().result.set("OK");

获取实例变量:

Template.instance().get("result");

所以你更新的代码将是:

Template.demo.created = function() {
    Template.instance().result.set("OK");
}

Template.demo.helpers({
    helper: function() {
        return Template.instance().get("result") || "FAILED";
    }
});
于 2015-02-15T18:40:19.860 回答
0

我认为最好的方法可能是设置一个 Session 变量,或者使用一个 Reactive 变量(使用 reactive-var 包 -这里是文档)。

我已经制作了一个流星垫来展示这更多 -这里

基本上:

Template.demo.created = function() {
    result = new ReactiveVar('OK');
}

Template.demo.helpers({
    helper: function() {
        return result.get() || "FAILED";
    }
});
于 2015-02-15T19:52:07.810 回答
0

似乎它是已知的并且已经修复 (?) Meteor 错误。更多信息:https ://github.com/meteor/meteor/issues/3745

来自rclaiGitHub 的评论:

这已经在下一个版本中得到解决和修复。

像这样运行流星,不确定它是否仍然有效:meteor --release TEMPLATE-CURRENT-DATA@0.0.1

另一种选择是使用aldeed:template-extensions,它具有非常好的特性,尤其是在处理模板实例时,我相信他们获取模板实例的方式是解决这个问题的方法。

于 2015-02-17T19:43:24.970 回答