2015-08-20 94 views
0

我有一個服務,使用全面的jQuery從interwebs上的服務請求JSON信息。帶有Ionic/Cordova的jQuery Ajax

我已經從Chrome控制檯確認我需要的數據正在返回,但在Ionic/Angular控制器返回後會收到響應。

// inside controller: 
$scope.days = Calendar.all(); 
// all() grabs a null object that hasn't been populated from AJAX result yet 

下面是在服務中的所有方法:

return { 
    all: function() { 
     return days; 
    }, 
    ... 
    }; 

所以控制器始終有一個空的對象時,它應該有Ajax響應的內容。

這是在服務的構造函數:

var days = {}; // makes it empty 

    $.get("https://jsonblob.com/api/5544b86z_edited_3aef9ba", function(data, status){ 

     var result = data; // Object {Month: "August", Year: "2015", Online: "true", Days: Array[31]} 
     days = result.Days; 
    }); 

所以$ scope.days停留在{};

將結果傳遞給控制器​​對象的最佳方法是什麼?

編輯:

試過$ HTTP方法,卻得到了「$ HTTP是沒有定義」 ......即使我註釋掉在我的index.html全面爆發jQuery的參考。 (得到了答案here

回答

4

你應該只使用$ http服務,它會觸發一個$申請你,所以視圖更新一旦結果回來,$ http方法將返回一個你可以使用的承諾在結果返回而不是回調時檢入腳本。

只需注入$ HTTP到您的服務(該服務的頂級功能)

然後更改您的代碼:

return $http.get("https://jsonblob.com/api/5544b86z_edited_3aef9ba") 
.then(function(response){ 
    var result = response.data; 
    days = result.Days; 
}); 

https://docs.angularjs.org/api/ng/service/$http

這可能是因爲天應是一個屬性也可以將服務注入控制器,然後在該範圍內設置對該參考的引用,然後在視圖中顯示它。

或者你可以有你的服務方法返回。然後調用的結果,這將是在控制器中的另一個諾言,那麼你可以這樣做:

Calendar.all.then(function(response){ 
    $scope.days = response.data; 
}); 

的承諾基本上是處理異步操作的另一種方式它取代了常規回調的需要,因爲promise對象存儲您傳遞給它的所有函數,並在結果返回時觸發它們。 。promise的.then方法實際上有兩個函數可選地首先是成功回調,然後是錯誤回調,詳情請參閱promise documentation