无法在CoffeeScript中重新分配变量

时间:2015-01-15 23:11:02

标签: angularjs coffeescript

我是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时,变量将填充来自服务的数据。但在主范围内,变量又是空的。我究竟做错了什么?我该如何解决?

如果有任何关于代码的内容,那应该做得更好,请告诉我,因为正如我所提到的,我刚开始学习。

1 个答案:

答案 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
]