4

JavaScriptアプリ内でMVCスタイルのテンプレートを作成するためにjQuery1.8.2とDust.jsv1.1.1を使用しています。ロジックヘルパーを使用すると{@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時間を盗みました。

npminstalldustjs-linkedinとnpminstalldustjs-helpersの両方を実行し、なぜそれが自動的に機能しないのか疑問に思っている人を助けるために(それは本質的にサイト上のすべてのドキュメントが示唆しているものだからです)。ここで、このバグが発生したときに通常発生するエラーを再構築します。

  if( dust.helpers[name]){
                  ^

そして、の1つ。

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を「helper」ではなく「helpers」に割り当てると、別のエラーが発生します。

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

誰かが「@」で始まるものを使用しようとしていることを検出するための小さなコードを書くのはかなり簡単です。おそらくヘルパーライブラリにロードされていません...そしてノードで動作させてください-ノードコンテキスト...またはドキュメントを修正することもできます。

グーグルがGrokかもしれないという答えをまとめるために私が費やした余分な15分が私がちょうど失った5時間を他の誰かを救うことを心から願っています。

-フィート

于 2012-12-06T08:32:19.843 に答える
5

おそらくDust core から削除されたため、 Dust.helpers が存在しないことが問題のようです。テンプレートがレンダリングされる場所には必ず、Dust コアと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;
    },
  });

ループを 1 から n までカウントする ${idx} の代わりに {position} を使用できるようになりました。

于 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 が使用したものとまったく同じ) を使用して適切な Dust のインスタンスを取得することだけです。require が成功するためには、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 に答える