1

我有以下通用代码。

MyClass.prototype.doSomething = function () {

    $.ajax({
        url: turl,
        dataType: 'jsonp',
        success: function (_this) { //closure
            return function (data) {
                _this._angular_scope.$apply(function () {

                    _this.property = // extract stuff from 'data'
                    _this.analyzeContent() // do more stuff with it
                })
            }
        }(this)
    })
}

基本上,这只是一个普通的 AJAX 调用。有个...

(1) 关闭“this”,以便成功函数可以访问我的对象及其状态

(2) 在内部,我返回一个对数据执行某些操作的函数,但是......

(3) 我希望 AngularJS 捕获成功所做的一切,因此解析数据的函数将进一步将其操作包装在 $apply 调用中。

这行得通,但我不禁想知道是否有更好的方法来实现这一点。由于嵌套函数的数量,我每次查看它时都必须考虑我在做什么。

这样可以吗,还是有更好的推荐风格?

4

1 回答 1

5

我假设此代码块位于角度服务、控制器或指令中。如果不是,那么手头就有一个更广泛的问题。Angularjs 附带了一个$http服务,它应该在这里用来代替 $.ajax。$http 提供了与 $.ajax 相同的所有功能,另外还有一个好处是它是可测试的,并且它与 angularjs 摘要循环集成,因此您无需担心 $scope.$apply() 的东西。我会做类似以下的事情:

MyClass.prototype.doSomething = function () {
  var self = this;
  $http.get( turl ).success( function (data) {
    self.property = data.stuff;
    self.analyzeContent();
  } );
}

这里要记住的重要一点是 javascript 使用函数作用域,而不是块作用域。只要一个对象存在于同一个函数中,它就被认为是“在范围内”。由于 的值this因上下文而异,因此您可以将其粘贴在变量(self)中,并确信该值是您期望的值。

于 2013-05-31T02:44:06.067 回答