我是CoffeeScript的新手并尝试编写Angular控制器。但是我认为变量范围存在问题。我的代码如下:
app.controller 'IndexController', ['$scope', 'Authentication', 'Items', 'Snackbar', ($scope, Authentication, Items, Snackbar) ->
activate = ->
itemsSuccessFn = (data, status, headers, config) ->
vm.items = data.data
return
itemsErrorFn = (data, status, headers, config) ->
Snackbar.error data.error
return
Items().all().then itemsSuccessFn, itemsErrorFn
return
vm = this
vm.items = []
vm.isAuthenticated = Authentication.isAuthenticated()
activate()
return
]
问题在于items变量。在itemsSuccessFn
中运行activate
时,变量将填充来自服务的数据。但在主范围内,变量又是空的。我究竟做错了什么?我该如何解决?
如果有任何关于代码的内容,那应该做得更好,请告诉我,因为正如我所提到的,我刚开始学习。
答案 0 :(得分:0)
您可以直接引用$scope
。
app.controller 'IndexController', ['$scope', 'Authentication', 'Items', 'Snackbar', ($scope, Authentication, Items, Snackbar) ->
activate = ->
itemsSuccessFn = (data, status, headers, config) ->
$scope.items = data.data
return
itemsErrorFn = (data, status, headers, config) ->
Snackbar.error data.error
return
Items().all().then itemsSuccessFn, itemsErrorFn
return
$scope.items = []
$scope.isAuthenticated = Authentication.isAuthenticated()
activate()
return
]
但是,如果您使用controllerAs
语法,则必须使用胖箭头保持对this
的正确引用。这样,您就不需要vm
变量。
app.controller 'IndexController', ['$scope', 'Authentication', 'Items', 'Snackbar', ($scope, Authentication, Items, Snackbar) ->
activate = =>
itemsSuccessFn = (data, status, headers, config) =>
@items = data.data
return
itemsErrorFn = (data, status, headers, config) ->
Snackbar.error data.error
return
Items().all().then itemsSuccessFn, itemsErrorFn
return
@items = []
@isAuthenticated = Authentication.isAuthenticated()
activate()
return
]