使用AngularJS 1.1.5和CoffeeScript,我正在尝试使用新的"控制器作为..."语法如下:
class EventCtrl
@$inject = ['$scope', '$http']
constructor: (@$scope, @$http) ->
@$http.get('/some/url/', config)
.success (data) ->
#set the events directive
@events = data
.error (data) ->
console.log('error!')
app.controller('EventCtrl', EventCtrl)
使用以下 HTML 片段:
<div ng-controller="EventCtrl as ctrl">
<div>{{ctrl.events}}</div>
</div>
除了@events中的更改不会更新模板(绑定点)之外,这工作正常。@$http.get
的success
处理程序中传入的"数据"看起来正常。
这段代码一直使用以前版本的 AngularJS 和常规的非类控制器。
更新一个(丑陋的)解决方案是显式设置this
(@
)到方法中的局部值(thiz
在下面的示例中)。不是很优雅,但它有效。
class EventCtrl
@$inject = ['$scope', '$http']
constructor: (@$scope, @$http) ->
thiz = @
@$http.get('/some/url/', config)
.success (data) ->
#set the events directive
thiz.events = data
.error (data) ->
console.log('error!')
溶液对success
处理程序使用胖箭头。构造函数会自动附加到实例,因此那里不需要胖箭头(如果它不是构造函数,就会如此)。
class EventCtrl
@$inject = ['$scope', '$http']
constructor: (@$scope, @$http) ->
@$http.get('/some/url/', config)
.success (data) =>
#set the events directive
@events = data
.error (data) ->
console.log('error!')
把它附加到scope
,而不是@
(如果.success
改变上下文,它甚至可能不是你的类实例。你可以使用咖啡脚本的胖箭头)。
另外,拥有init
方法有什么意义?这正是构造函数的目的。