AngularJS的CoffeeScript基于类的控制器不会更新模板



使用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.getsuccess处理程序中传入的"数据"看起来正常。

这段代码一直使用以前版本的 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方法有什么意义?这正是构造函数的目的。

最新更新