cem*_*ate 1 javascript ajax design-patterns coding-style angularjs
我有以下一般代码.
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)
})
}
Run Code Online (Sandbox Code Playgroud)
基本上,这只是一个普通的AJAX调用.有个...
(1)关闭"this",以便成功函数可以访问我的对象及其状态
(2)在里面,我返回一个对数据执行某些操作的函数,但是......
(3)我想要的一切,成功确实被AngularJS被捕获,所以这个功能解析数据,进一步,在$应用调用它包装的行为.
这有效,但我不禁想知道是否有更好的方法来实现这一目标.由于嵌套函数的数量,我每次看到它时都要考虑我正在做什么,这是正确的.
这没关系,还是有更好的推荐风格?
我假设这个代码块在一个角度服务,控制器或指令内.如果不是,那么手头有更广泛的问题.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();
} );
}
Run Code Online (Sandbox Code Playgroud)
这里要记住的重要一点是javascript使用函数作用域,而不是块作用域.只要一个对象存在于同一个函数中,它就被认为是"在范围内".由于值的大小this取决于上下文,您可以将其添加到变量(self)中,并确信该值是您所期望的值.