0

私は[一見]些細な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ドキュメントに何かが欠けていますか?

4

2 に答える 2

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;
   }
 }
}
于 2012-04-27T19:10:14.283 に答える
0

これは、特に関数を返す場合、Javascriptが常に明白であるとは限りません。

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

この行を見てください:https ://github.com/akdubya/dustjs/blob/master/lib/dust.js#L319

これがちょっと起こっていることです:

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.

これはDustのバグですか?おそらく、context.current()を介してコンテキストがあるためではありません。

thisを指すのは理にかなっていますかwindow。いいえ。ただし、サーバー側でDustを使用すると、より適切に使用できるようになりthisます。

于 2012-04-27T21:30:21.033 に答える