问题标签 [google-closure-templates]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
228 浏览

google-closure-compiler - 闭包模板生成不使用 StringBuilder 的代码

我最近从 GitHub 中提取了一个项目,该项目在其 build.xml 中包含了一个 compile-soy 任务。该任务使用 SoyToJsSrcCompiler.jar 将几个大豆文件编译成 javascript。该项目包含目标目录,因此我可以看到编译后的文件包含如下代码:

当我在没有任何代码更改的情况下运行相同的任务时,生成的编译结果会不断用 opt_ignored 替换 opt_sb 并删除对 soy.StringBuilder 的所有引用。我手动运行“java -jar lib/SoyToJsSrcCompiler.jar --outputPathFormat target/soy2/fbldr.soy templates/fbldr.soy”,而不是使用build.xml。我得到相同的结果。

从我读过的所有闭包模板文档中,预计输出将使用 StringBuilder。我无法弄清楚为什么我的调用不断生成忽略 StringBuilder 的输出。有人会碰巧知道是什么原因造成的吗?

0 投票
1 回答
2045 浏览

google-closure-templates - 如何检查大豆模板中的空地图?

我已经阅读了Google Soy/Closure 模板的文档,但找不到任何方法来检查 Map 是否为空;我只能查找给定键的映射值。有没有办法找出地图的大小?

我目前的解决方法是用模板替换任何空地图,null然后null在模板中检查,例如:

0 投票
1 回答
390 浏览

google-chrome-extension - 关闭使用 autoescape=strict 禁用 URL 替换

我正在使用 Closure 为 chrome 扩展渲染一个大豆模板,并且在插入chrome-extension://*链接时遇到问题,因为它们被过滤了soy.$$filterNormalizeUri

虽然通常不允许chrome-extension://*链接是不可取的,但它在 chrome 扩展中是有意义的。

有没有办法将协议列入白名单或允许未过滤的 URL 替换的特定情况(可能使用soy.$$normalizeUri而不是soy.$$filterNormalizeUri)?输入不是用户定义的,应该可以安全使用。

例子:

$list生成的样式表路径列表在哪里chrome-extension://*

返回的错误是Uncaught AssertionError: Failure: Bad valuechrome-extension://...for |filterNormalizeUri

有关转义的信息:https ://developers.google.com/closure/templates/docs/security#in_urls

0 投票
1 回答
1790 浏览

html - 闭包模板:从大豆文件中传递的参数设置全局变量

有没有办法将 .soy 文件中的全局变量设置为从 .html 传入的参数?这样所有模板都能够访问全局变量,以避免将相同参数重新传递给每个模板的冗余。

例如像这样工作的东西:

HTML:

大豆:

并且可以从所有其他模板访问 globalVariable

0 投票
0 回答
85 浏览

javascript - goog.ui.ToolbarMenuButton 不是函数;谷歌关闭

嘿,我正在尝试将工具栏菜单按钮添加到工具栏,但由于某种原因,我收到此错误 goog.ui.ToolbarMenuButton is not a function ; 工具栏将混合工具栏按钮和工具栏菜单按钮。现在它只是工具栏按钮。

最初我有 selectBtn1 作为 ToolbarButton ,它工作正常。但是当我将它转换为toolbarMenuButton(在selectBtn2中看到)时,它给出了上述错误。为什么 ?根据文档,它们都采用相同的参数。

0 投票
0 回答
319 浏览

java - 使用 Maven 编译 Google Closure 模板

我正在开发基于 Maven 构建的 Java Spring MVC 应用程序,我想将存储在“resources/soy”目录中的 SOY 模板编译为可以通过表示层访问的 JavaScript 文件。这可以使用SoyToJsSrcCompiler手动完成,但是,最好找到一种在项目编译期间自动处理模板的方法。我找到了一个插件,它应该能够做到这一点,但是,我无法让它工作(没有结果也没有产生错误):

这怎么能以一种直接的方式完成呢?最好不使用第三方插件?

谢谢是提前!

0 投票
3 回答
392 浏览

javascript - 在大项目的闭包模板中没有继承怎么能活?

我们使用闭包库和闭包编译器,我们想使用闭包模板。

但是闭包模板没有继承。这对我们来说确实是个问题。

据我了解,闭包模板没有继承的原因是因为模板必须简单且易于阅读。

但是在大项目中没有继承怎么能活呢?

例如,我们有一个模板文件button.soyproject.createButton ,它使用公共模板和私有模板生成按钮: project.createOpenTag_, project.createCSSClasses_, project.createAttributes_, project.createContent_, project.createCloseTag_

我们有 JavaScript 类project.Button,并且我们有project.ButtonCircle(也许这个单独的类project.ButtonCircle似乎没有必要,但这只是一个示例)扩展了project.Button.

project.ButtonCircleproject.createButton需要对模板进行少量更改。

当然我们可以添加新的功能project.createButton,但这是一个非常糟糕的主意,因为这种方法将来会创建怪物模板。

或者我们可以project.createCircleButton在文件button-circle.soy中创建公共模板,从中调用所有私有模板project.createButton,当我们需要“覆盖”这些私有模板之一时(例如project.createCSSClasses_),我们只需在button-中创建新的私有模板- circle.soy的名字project.createCSSClassesCirbleButton_

然而在这种情况下,我们需要将所有内容从 复制粘贴project.createButtonproject.createCircleButton。这太可怕了。

我们也尝试使用委托模板,但它不适合继承。

解决这个问题的方法是什么?

0 投票
0 回答
279 浏览

google-closure-templates - 在javascript中显示大豆变量值,如警报

我们在 soy 文件中是否有任何与 javascript alert() 等效的东西来显示变量值?

我也尝试在大豆中使用 javascript,如下所示,但没有帮助(extendedFieldView 是一个列表):

谢谢!

0 投票
1 回答
304 浏览

google-closure - Google Closure Library 在简单示例中无法正确加载依赖项

我正在尝试使用 Closure Templates 使 google Closure Library 正常工作,但是当我运行我的应用程序时它会引发错误soyutils_usegoog.js:74 Uncaught TypeError: Cannot read property 'StringBuffer' of undefined

我已经研究了所有内容,添加了 goog deps.js 文件,移动了一些东西,但是我仍然无法让它运行。所以我然后从CLosure网站复制了确切的例子来尝试找出它,它仍然给我同样的错误。我在这里尝试了第一个简单的例子:https ://developers.google.com/closure/templates/docs/helloworld_js

如果我goog.string.StringBuffer在控制台中查询它返回一个函数,它似乎是最后加载该文件。

0 投票
1 回答
1220 浏览

google-closure-templates - 如何在谷歌闭包模板(大豆模板)中声明和更新变量

让我们采用 2 个数组arr1 = ['a', 'b', 'c']arr2 = ['1' , '2', '3']。当将这些数组作为参数传递给大豆模板时,我想如下所示进行迭代并打印一个指示到目前为止迭代的总项目的索引。

由于使用let声明的变量不能重新分配给新值,模板中有没有办法实现我上面显示的逻辑。