私は[一見]些細なdust.jsテンプレートを持っています。テンプレートのレンダリングに使用しているコンテキストオブジェクトには、コンテキストオブジェクト内の別のアイテムを参照するハンドラーが含まれています。また、コンテキストオブジェクト内の別のアイテムを参照するtoStringハンドラーも含めます。
レンプレート:
{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に戻ります。
これが問題になる唯一の理由(直接アクセスできない理由error.st
)は、st配列が実際にはQooxdooプロパティに格納されており、生成されたゲッターにしかアクセスできないためです。上記の例は、できるだけ単純に実際のオブジェクトを模倣しています。
これはdust.jsのバグですか?ハンドラーで正しいスコープを失っていますか?または、スコープを保持するために、dust.jsドキュメントに何かが欠けていますか?