2013-05-31 92 views
1

我有以下通用代碼。我可以改進這個AngularJS/AJAX javascript代碼片段嗎?

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)關閉了「這個」,這樣的成功函數可以訪問我的對象和它的狀態

(2)裏面,我返回的數據進行一些功能,但是...

(3)我希望AngularJS能捕獲成功的所有東西,所以這個解析數據的函數進一步將它的動作包裝在$ apply調用中。

這有效,但我不禁想知道是否有更好的方法來實現這一點。這是正確的,因爲嵌套函數的數量,我必須考慮每次看到它時所做的事情。

這樣好嗎,還是有更好的推薦風格?

回答

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的值取決於上下文而有所不同,因此您可以將其固定在變量(自我)中,並確信該值是您期望的值。

相關問題