【问题标题】:Accessing a global javascript variable inside jsrender template and updating it访问 jsrender 模板中的全局 javascript 变量并更新它
【发布时间】:2012-09-11 18:24:18
【问题描述】:

我正在尝试使用来自 jsrender 模板的值更新全局 javascript 变量。我怎样才能完成它...

我创建了一个小提琴http://jsfiddle.net/4RH7n/8/

我需要将最后一部电影的名称放入该 javascript 变量中..

【问题讨论】:

  • movies 是一个可以使用的数组 movies.push({ name: "any", releaseYear: "any"})

标签: javascript jsrender


【解决方案1】:

可以轻松注册自定义标签和助手以访问或修改全局变量。有一个示例here(代码为here)显示了两种方式,并说明了如何在模板中设置和获取全局变量。助手/自定义标签比使用{{* ...}} 更好(因为这样你可以更好地分离代码和标记) - 但如果你确实使用{{* 语法,你必须设置allowCode=true。 (见this example)。

上述方法是使用您自己的扩展来访问任何全局的方法。但是,对于大多数情况,您可能只需要访问某些特定的全局变量。在这种情况下,将 global(s) 作为选项传递给 .render() 调用(或 .link() 调用,如果您使用 JsViews)非常容易,如下所示:

...render(myData, { foo: myFooGlobal, bar: myBarGlobal });

然后在模板中的任何表达式中访问它们,例如:

... {{:~foo}} ... {{for ~bar}} ... {{/for}} ...

如果您希望能够从所有模板访问这些全局变量(或对特定模板的所有调用),您可以将它们注册为全局(或特定于模板的)帮助程序/模板参数,然后您不需要t 需要通过渲染/链接调用传递它们。

例如,为所有模板全局注册它们:

$.views.helpers({
    foo: myFooGlobal,
    bar: myBarGlobal 
});

然后您以与上述完全相同的方式访问它们,使用 ~foo(或 foo() 用于函数)。

您可以在 GitHub 上找到所有这些方法的示例。


更新:

除了上面提到的文档和示例之外,http://www.jsviews.com 上还有更多最新的文档和示例,特别是 herehere

【讨论】:

  • 嗨鲍里斯,很高兴你看到这个问题......我刚刚创建了一个小提琴jsfiddle.net/4RH7n/21 不知何故它不能像在普通网站上那样完美地工作。但是看看这个小提琴你会明白我在做什么......
  • jsfiddle.net/MDvZx/1 展示了一种连接点击事件的方法。您还可以使用 JsViews 作为一种使交互更容易实现的方式...
  • 谢谢鲍里斯,我使用了您的提示使其工作......非常感谢您的宝贵建议。感谢您的时间和精力。
  • 我刚刚编辑了上面的回复,添加了一些针对不同场景的附加信息。
【解决方案2】:

不太确定您在问什么。数据不会来自模板,您已经拥有该对象中的数据。直接使用即可:

window.abcfx = function() {
  alert(movies[movies.length-1].name);
}

fiddle

【讨论】:

  • 对不起,可能是我不够清楚.. json 是动态更新的,它不是恒定的。也取决于少数情况,我可能会加载整个 json 或部分项目。这就是为什么我想从 jsrender 模板中更新全局 js 变量。这可以实现吗?
  • 抱歉,只是不明白为什么需要对模板进行任何操作。该模板是客户端,因此您可以在某处获得可用的 json 数据来获取所需的值。
  • 好的,这是当前的场景。我有两个json。使用主 json,我在表单元素中加载所有细节。一个表单元素是一个下拉框,我需要填充所有值(这些值来自另一个 json)并选择当前 json 中的值。
猜你喜欢
  • 2017-02-24
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2018-10-28
相关资源
最近更新 更多