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 属性中,而我只能访问生成的 getter。上面的示例尽可能简单地模仿实际对象。

这是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}which 是一个函数。它调用该函数,但没有为其设置范围;所以它默认为您浏览器中的全局范围是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.

这是灰尘中的错误吗?可能不是,因为您通过 context.current() 获得了上下文。

this指向是否有意义window。不,但是我想当您在服务器端使用 Dust 时,我们将更好地使用this.

于 2012-04-27T21:30:21.033 回答