Javascript Dust.js逻辑助手出现问题

Javascript Dust.js逻辑助手出现问题,javascript,jquery,asp.net-mvc,json,dust.js,Javascript,Jquery,Asp.net Mvc,Json,Dust.js,我正在使用jquery1.8.2和Dust.jsv1.1.1在JavaScript应用程序中进行MVC风格的模板制作。当我使用{@gt}逻辑助手时,我收到以下控制台错误: Uncaught TypeError: Cannot read property 'gt' of undefined 我相信我的模板中使用了正确的语法: <ul class="listview"> {#seasons} <li> <h3>{name}</h3&

我正在使用jquery1.8.2和Dust.jsv1.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 -->
如果我从模板中删除
{@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 -->
    {#季节}
  • {name}

    {id}

    {个月}
  • {/季节}

非常感谢您的帮助,谢谢

听起来你的问题是dust.helpers不存在,可能是因为它。确保在呈现模板的任何位置都有Dust core和加载。

请密切关注smfoote提供的链接

在节点中“加载”灰尘辅助对象所需的特定语法为:

var dust = require('dustjs-linkedin');
dust.helper = require('dustjs-helpers');
请注意,这不是写在链接上的内容,链接说明这应该是带有“S”的dust.helper

您在主文档站点的任何地方都找不到该短语

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

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

为了帮助那些同时运行npm安装dustjs linkedin和npm安装dustjs 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
未定义:1
“”.write(“”).write(“\n\n”).helper(“contextDump”,ctx,{},null).write(“\n\
^
TypeError:无法调用未定义的方法“write”
当有人试图使用以“@”开头的东西并说..嘿,你可能还没有加载到你的助手库中…并使它在节点而不是节点上下文中工作…或者他们可以修复文档时,编写一些代码来检测它是相当简单的

我真诚地希望,我花了额外的15分钟来整理一个谷歌可能会搜索到的答案,这将为其他人节省我刚刚失去的5个小时


-ft

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

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

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

要使其仅在客户端工作(例如,在仅用于开发的客户端浏览器中运行),查看此工作演示页上的源代码有很大帮助:

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

例如,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}

很明显,为什么更改会起作用,但随着您的学习,该页面非常有帮助。

如果您无法添加帮助程序,这将是一个非常奇怪的决定,您仍然可以创建自己的函数,像这样的函数可以用来代替 @gt或@math

var baseContext = dust.makeBase({
    position: function(chunk, context) {
        return context.stack.index + 1;
    },
  });
现在,您可以使用{position}而不是${idx},后者将循环计数从1到n。

编辑:

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

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

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


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

也就是说,我已经厌倦了与consolidate、adaro、dustjs linkedin、dustjs helpers等的争论,这些争论都没有以一种简单的方式公开功能以供在Express中使用,因此我编写了一个小包装器

下面是我的示例代码,添加了几个助手

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

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

希望这对某些人有用。

太好了!谢谢,我加载了助手库并解决了它。出于好奇,你知道为什么要删除这些助手吗?我们已经删除了,因为这些助手不是灰尘核心的一部分。这些助手是为了添加一些特殊行为的装饰。有很多人不知道“不需要,所以没有理由将它们放在核心中。这是一个非常糟糕的文档,您在解释中使用的链接实际上是不正确的。嘘。这确实非常糟糕!感谢您发现了这一点,为我节省了一些时间。”。
var dust = require('./lib/dust-express');
app.engine('dust', dust(app, {
    publicdir: path.join(app.get('basedir'), 'public'),
    mtimes: app.util.mtimes,
    helpers: true
}));