【发布时间】:2016-08-01 15:25:24
【问题描述】:
我正在使用 ES6 功能创建一个 Angular 应用程序,所以我使用 Babel 来转译 JS。我决定不使用 ES6 模块,所以我使用的是 es2015-script,而不是常规的 es2015 预设。
问题在于 Babel 编译箭头函数的方式。我用的是Angular的controllerAs记法,像这样
angular.module('appControllers')
.controller('StoryController', ['StoryProvider', (StoryProvider)=>{
this.plaintext='test plain';
}]);
这段代码被转译为
var _this = this;
angular.module('myControllers')
.controller('StoryController', ['StoryProvider', function (StoryProvider)
{
_this.plaintext = 'test plain';
}]);
所以this 在完全错误的范围内并且绑定不起作用。当我手动将编译后的代码更改为
angular.module('myControllers')
.controller('StoryController', ['StoryProvider', function (StoryProvider)
{
var _this = this;
_this.plaintext = 'test plain';
}]);
一切正常。
为什么 Babel 以这种方式设置中间 _this 变量?是否有另一个 Babel 预设可以正确处理这个问题?我应该使用 ES6 模块吗?我首先遇到了与本期angular 1.5 component and babel 中描述的相同的问题,这就是我使用es2015-script 预设的原因。
【问题讨论】:
-
用常规
function()替换箭头函数有帮助,但我真的很想使用词法this。 -
这段代码似乎没有什么问题;这里使用箭头函数是错误的。控制器被设计为拥有自己的
this。箭头函数正在做它设计的事情(词法绑定this值(不绑定自己的this、arguments、super或super或new.target)。),这不是控制器期望被声明。 -
" 但我真的很想用这个词法。"你不能,除非你想使用
$scope
标签: javascript angularjs this babeljs