2012-04-26 12 views
0

私は[一見]些細なダスト.jsテンプレートを持っています。テンプレートをレンダリングするために使用しているコンテキストオブジェクトには、コンテキストオブジェクト内の別のアイテムを参照するハンドラが含まれています。また、コンテキストオブジェクト内の別の項目を参照するtoStringハンドラも含まれています。dust.jsハンドラで 'this'コンテキストが失われていますか?

テンプレート:

{error} 
<pre> 
{#error.getStackTrace} 
{.}{~n} 
{/error.getStackTrace} 
</pre> 

コンテキスト:レンダリング

{ 
    error: { 
    st: ['a','b','c'], 
    msg: 'This is an error message', 
    getStackTrace: function() { 
     return this.st; 
    }, 
    toString: function() { 
     return this.msg; 
    } 
    } 
} 

This is an error message<pre></pre> 

私が直接{#error.st}を参照する場合、それは正しくレンダリング:

This is an error message<pre>a 
b 
c 
</pre> 

getStackTrace()ハンドラの内部で 'this'を調べると、DOMWindowをポイントしています。しかし、toString()を暗黙的に呼び出すと、スコープが正しく設定されることは興味深いことです。明示的にtoString(){error.toString}を呼び出すと、スコープはDOMWindowに戻ります。 STの配列は、実際にQooxdooプロパティに格納されており、私は唯一の生成ゲッターへのアクセス権を持っているので

これが問題である唯一の理由は、(なぜ私が直接error.stにアクセスすることはできません)です。上の例は実際のオブジェクトを私ができるだけ単純に模倣しています。

これはdust.jsのバグですか?それはハンドラで正しい範囲を失っていますか?または、私はdust.js文書の範囲を保持するために何かを逃している?

答えて

0

あなたはこの方法でそれを使用することもできます

{ 
error: { 
    st: 'a,b,d', 
    msg: 'This is an error message', 
    getStackTrace: function (chunk, context) { 
    return context.current().error.st; 
    }, 
    toString: function() { 
    return this.msg; 
    } 
} 
} 
+0

これは正しい解決策ですが、必ずしも私の問題を解決するものではありません。私は、モデルオブジェクトとテンプレート/コンテキストが完全に分離していることを期待していました。ありがとう、ジャイロ! – schlomie

+0

公式のオリジナルのドキュメントは間違っていますが、ダストは参照オブジェクトの構築方法には気を付けません。たとえば、プロトタイプのオブジェクトをスタックにプッシュすることができます。あなたのオブジェクト。 - 「Contexts」(http://akdubya.github。com/dustjs /) – schlomie

0

このではJavaScriptを使用して、関数を返すされている場合は特に、必ずしも明確ではないです。

ダストが関数である{error.st}のような参照を解決するとき。その関数を呼び出しますが、スコープを設定しません。したがって、ブラウザのグローバルスコープはデフォルトでwindowになります。この行で

ルック:

var current_context = { 
    st: 'a,b,d', 
    msg: 'This is an error message', 
    getStackTrace: function (chunk, context) { 
    return error.st; 
    }, 
    toString: function() { 
    return this.msg; 
    } 
} 
current_context.st(); // outputs correctly 

var elem = current_context.st; // here is your reference {.} 
elem(); // Dust tries to resolve your reference but it doesn't set the scope 
elem.call(current_context); // if we pass the scope you'll get what you want. 

これはダストのバグです:https://github.com/akdubya/dustjs/blob/master/lib/dust.js#L319ここ

がみかん何が起こっているのですか?あなたがcontext.current()を介してコンテキストを持っているからではないでしょう。

thiswindowを指していることは意味がありますか?いいえ、私が想像するサーバー側でダストを使用すると、thisの方が良いでしょう。

+0

「この関数は関数を呼び出すが、スコープを設定しないため、ブラウザのグローバルスコープがデフォルトになります」....これは、次の文に矛盾しています。 「これ」というドキュメントは元のままです。プロトタイプメソッドの内側から、これは常にプロトタイプオブジェクトを参照する必要があります。 elem.call()はグローバルスコープに戻ります。そうすれば、elem.call(context)を使ってコンテキストを渡すことができます。なぜelem.apply(context、[...])ではな​​いのですか?これにより、正しいスコープが保持されます。 – schlomie

+0

次のことを考慮してください:var obj = {a: 'abc'、メソッド:function(){return this.a; }}; var b = obj.method; obj.method b.call();/* undefined */b.apply(obj、[]);/* 'abc' * /これはクロージャを実行しスコープを保持する正しい方法です。 – schlomie

+0

'ダストはあなたの参照オブジェクトがどのように構築されても気にしません。たとえば、プロトタイプのオブジェクトをスタックにプッシュできます。 – jimmyhchan

関連する問題