我有以下一般代码。
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调用中。
这有效,但我不禁想知道是否有更好的方法来实现这一目标。由于嵌套函数的数量,我每次看到它时都要考虑我正在做的事情,这是正确的。
这没关系,还是有更好的推荐风格?
答案 0 :(得分: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)中,并确信该值是您期望的值。