4

我正在使用jQuery 1.8.2Dust.js v1.1.1在 JavaScript 应用程序中进行 MVC 样式模板。当我使用{@gt}逻辑助手时,我收到以下控制台错误:

Uncaught TypeError: Cannot read property 'gt' of undefined

我相信我的模板中使用了正确的语法:

<ul class="listview">
{#seasons}
    <li>
        <h3>{name}</h3>
        <p class="desc">{id}</p>
        {@gt key="months" value="0"}
        <span class="count">{months}</span>
        {/gt}
    </li>
{/seasons}
</ul><!--// end .listview -->

这是 JSON 结构:

{
    "seasons":[
        {
            "name":"Spring",
            "id":"weklv7",
            "months": 8
        },
        {
            "name":"Summer",
            "id":"lvuec5",
            "months": 4
        }
    ]
}

如果我{@gt}从模板中删除逻辑助手,错误就会消失,并且模板会正确加载为 HTML。例如:

<ul class="listview">
{#seasons}
    <li>
        <h3>{name}</h3>
        <p class="desc">{id}</p>
        <span class="count">{months}</span>
    </li>
{/seasons}
</ul><!--// end .listview -->

非常感谢任何帮助,谢谢!

4

6 回答 6

7

请密切注意提供的链接 smfoote。

为了在节点中“加载”灰尘助手,您需要的特定语法是:

var dust = require('dustjs-linkedin');
dust.helper = require('dustjs-helpers');

请注意,这不是链接上写的内容,链接文件表明这应该是带有“s”的dust.helper(S)。

您根本不会在主文档站点上的任何地方找到该短语。

显然,这应该是连接事物的方式,这应该是完全直观的。

有时我觉得那些没有记录他们对项目所做的重大改变的影响的人正在偷走我的生活。这个特殊的文档差距偷走了大约 5 个小时。

为了帮助那些同时运行 npm installdustjs-linkedin 和 npm installdustjs-helpers 并且想知道为什么它不能自动工作的灵魂(因为它本质上是网站上所有文档的建议)。我将重建您在此处遇到此错误时通常会遇到的错误:

  if( dust.helpers[name]){
                  ^

然后一个..

TypeError: Cannot read property 'if' of undefined
TypeError: Cannot read property 'math' of undefined
TypeError: Cannot read property 'eq' of undefined
TypeError: Cannot read property 'not eq' of undefined
TypeError: Cannot read property 'ne' of undefined
TypeError: Cannot read property 'lt' of undefined
TypeError: Cannot read property 'gt' of undefined
TypeError: Cannot read property 'select' of undefined
TypeError: Cannot read property 'size' of undefined
TypeError: Cannot read property 'tap' of undefined
TypeError: Cannot read property 'contextDump' of undefined
TypeError: Cannot read property 'idx' of undefined
TypeError: Cannot read property 'sep' of undefined

有趣的是,如果将dustjs-helpers 分配给“helpers”而不是“helper”,则会出现不同的错误:

undefined:1
").write("</form>").write("\n\n").helper("contextDump",ctx,{},null).write("\n\
                                                                    ^
TypeError: Cannot call method 'write' of undefined

编写一些代码来检测某人何时尝试使用以“@”开头的东西并说..嘿,您可能没有加载到您的帮助程序库中......并使其在节点中工作而不是-节点上下文......或者他们可以修复文档。

我真诚地希望,我花费额外的 15 分钟来整理 Google 可能会 Grok 的答案,这将节省其他人我刚刚失去的 5 个小时。

-英尺

于 2012-12-06T08:32:19.843 回答
5

听起来你的问题是dust.helpers 不存在,可能是因为它已从 Dust core 中删除。确保在渲染模板的任何地方都加载了 Dust core 和Dust 助手。

于 2012-11-10T22:21:02.447 回答
3

尽管 ftrotter 在这里提供了很好的信息,但我还是想补充一下,因为我仍然迷失在“s”中。这是我编写自定义帮助程序所必须做的:

dust.helper = require('dustjs-helpers');
dust.helpers.myHelper = function (chunk, ctx, bodies, params) {

请注意,当我需要时,我没有“s”,但在编写助手时必须添加“s”。

于 2013-01-23T12:21:34.907 回答
1

为了让它只在客户端工作(例如在客户端浏览器中运行以进行开发),在这个工作演示页面上查看源代码有很大帮助: http ://linkedin.github.com/dustjs/test/test.html?q =帮手

该站点对于仅调试语法也非常有用。

例如,select 的示例不适用于客户端 javascript 编译。

{@select key=\"{foo}\"}
     {@eq value=\"bar\"}foobar{/eq}
     {@eq value=\"baz\"}foobaz{/eq}
     {@default} - default Text{/default}
 {/select}

但这确实:

 {@select key="{foo}"}
     {@eq value="bar"}foobar{/eq}
     {@eq value="baz"}foobaz{/eq}
     {@default} - default Text{/default}
 {/select}

很明显,为什么更改会起作用,但是在您学习的过程中,该页面非常有用。

于 2013-02-25T21:53:19.977 回答
0

万一你不能添加助手,这将是一个非常奇怪的决定,你仍然可以创建自己的函数,可以用来代替 @gt 或 @math

var baseContext = dust.makeBase({
    position: function(chunk, context) {
        return context.stack.index + 1;
    },
  });

现在您可以使用 {position} 而不是 ${idx} 来计算循环从 1 到 n。

于 2013-02-26T20:32:43.010 回答
0

编辑:

自从我几天前写这篇文章以来,我学到了更多关于灰尘的知识。这里有一些澄清!

dustjs-helpers 库仅提供文档中列出的“预制”助手。不需要创建自己助手。require('dustjs-linkedin')是否可以互换,require('dustjs-helpers')具体取决于您是否需要默认助手。(在你的情况下,你这样做。)

另外,我在寻求帮助使这一切都在 Express 中工作时发现了这一点,但我意识到您的问题与此无关。希望这项工作对可能像我一样偶然发现这个问题的人有用,但是,我将把它留在这里。


注意:dustjs-helpers 需要在dustjs-linkedin 中并返回它的一个实例,所以您真正需要做的就是var dust = require('dustjs-helpers');获得一个正确的具有帮助器支持的灰尘实例(与dustjs-helpers 使用的完全相同)。您确实需要安装dustjs-linkedin 以便要求成功,但仅此而已。

也就是说,我厌倦了与 consolidate、adaro、dustjs-linkedin、dustjs-helpers 等争论不休,它们都没有以直接的方式暴露出用于 Express 的功能,并编写了一个小包装器。

这是我的示例代码,添加了几个助手。

https://gist.github.com/myndzi/8837944

我在我的应用程序设置中调用它,如下所示:

var dust = require('./lib/dust-express');
app.engine('dust', dust(app, {
    publicdir: path.join(app.get('basedir'), 'public'),
    mtimes: app.util.mtimes,
    helpers: true
}));

希望这对某人有用。

于 2014-02-06T03:30:49.467 回答