Meteor:为什么我通过将function(){}切换为()=>来丢失我的数据上下文{}?

时间:2015-07-03 04:07:31

标签: javascript meteor ecmascript-6

所以我正在尝试使用ES6,安装了grigio:babel软件包,并开始浏览我的es5代码,并在遇到问题时将其更新为一些新的ES6语法。

最初我的模板助手看起来像这样:

Template.exampleTemplateName.helpers({
   exampleHelper: function() {
      //returns an array from Mongo Collection
   }
});

在Blaze中使用每个循环

{{#each exampleHelper}}
{{/each}}

正如您所期望的,此事件循环中元素的所有事件处理程序都可以访问exampleHelper通过this关键字返回的Mongo Collection中的字段。 this.exampleField将完全返回我希望它返回的内容。

所以现在我开始更新到ES6了。出于某种原因,以下语法会破坏数据上下文,因此,而不是this返回您期望的内容,而是返回Window

Template.exampleTemplateName.helpers({
    exampleHelper() {
        //returns an array from Mongo Collection
    }
});

以上是我的第一次尝试,然后我尝试了:

Template.exampleTemplateName.helpers({
    exampleHelper: () => {
        //returns an array from Mongo Collection
    }
});

所以我通过Babeljs的在线翻译运行了上面的ES6代码并收到了以下内容,这显然是不正确的,因为我不想要一个命名函数:

Template.exampleTemplateName.helpers({
     exampleHelper: function exampleHelper() {}
});

有人能告诉我正确的语法应该是什么样的吗?

2 个答案:

答案 0 :(得分:4)

  

有人能告诉我正确的语法应该是什么样的吗?

您的原始代码完全没问题。您不必滥用这些功能并使用它们只是为了使用它们,节省一些键盘等。在这种情况下,您应该使用正常的匿名功能。

你与this指向全局对象的混淆的原因是因为这是箭头函数的工作原理:它们有词汇 this,而不是动态。这意味着this引用在创建函数时静态绑定到函数上下文(在您的情况下为window),并且在运行时不会动态解析。

答案 1 :(得分:2)

此代码无效(它将显示窗口对象):

public AsyncTableQuery<T> Table<T> ()
    where T : new ()
{
    //
    // This isn't async as the underlying connection doesn't go out to the database
    // until the query is performed. The Async methods are on the query iteself.
    //
    var conn = GetConnection ();
    return new AsyncTableQuery<T> (conn.Table<T> ());
}

因为当你使用SQLiteAsync.cs语法时,它想要做这样的事情:

<GridLayout
    android:id="@+id/home_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent" // <---- change here to wrap_content and see.
    android:columnCount="2"
    android:orientation="horizontal"
    android:rowCount="2">

所以在这种情况下,Template.homePage.helpers({ exampleHelper: function () { return [ {text: 'this'}, {text: 'that'}, {text: 'the other thing'} ]; }, process: () => { console.log(this); } }); 确实等于=>。解决方案是在此方案中不使用var self = this; process(function () { doSomethingWith(self); });