所以我正在尝试使用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() {}
});
有人能告诉我正确的语法应该是什么样的吗?
答案 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);
});
。