dust.js在处理程序中丢失了“这个”上下文?

时间:2012-04-26 18:30:12

标签: templates scope this dust.js

我有一个[看似]琐碎的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文档中遗漏了一些内容以保留范围?

2 个答案:

答案 0 :(得分: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;
   }
 }
}

答案 1 :(得分: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.

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

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