2015-02-10 16 views
0

我似乎在使用JSON數據填充AngularJS中的select元素時遇到了一些問題。AngularJS基於字符串的JSON鍵值對

代碼:

/* the API returns: {"id":3,"name":"Some Address"} */ 
 

 
app.service("addressService", function($http, $q) { 
 
    var deferred = $q.defer(); 
 
    $http.get('/index.php/Pro/getAddresses').then(function(data) { 
 
    deferred.resolve(data); 
 
    }); 
 
    this.getCounties = function() { 
 
    return deferred.promise; 
 
    }; 
 
}); 
 

 
app.controller('homeController', function($scope, $http, addressService, $routeParams) { 
 
    $scope.availableCounties = {}; 
 

 

 
    var promise = addressService.getCounties(); 
 
    promise.then(function(data) { 
 
    $scope.availableCounties = data; 
 
    }); 
 
});
<select name="sender_address_id" ng-model="sender_address_id" ng-options="county.id as county.name for county in availableCounties"> 
 

 
</select>

當我查看該頁面,選擇欄仍然無人居住。我也可以控制API。如果使用比json_encode()更好的函數或方法,那也可以解決問題。

編輯,控制檯輸出鞋子起來就是:

 
Object {data: Object, status: 200, headers: function, config: Object, statusText: "OK"} 
config: Object 
data: Object 
    id: 3 
    name: "Some Address" 

    __proto__: Object 

headers: function (c){a||(a=Xc(b));return c?(c=a[Q(c)],void 0===c&&(c=null),c):a}status: 200 
statusText: "OK" 
__proto__: Object 
+0

如果將其登錄到視圖中,則爲{{availableCounties}}'爲空? – DonJuwe 2015-02-10 07:58:50

+0

將數據分配給您的承諾中的availableCounties時,數據的實際外觀如何?它可能需要是'in availableCounties'中用於處理ng-options聲明的一組對象。 – mindparse 2015-02-10 08:01:26

+0

已更新問題。 :| – on3pk 2015-02-10 08:10:08

回答

0

包裝紙的$ HTTP查詢到的服務是無用的在這裏,因爲$ HTTP有一個內置的諾言系統(see documentation),和你不要添加任何邏輯(緩存,數據排序等)。

所以,你可以擺脫你的服務,並使用這個死簡單的控制器:

app.controller('homeController', function ($scope, $http) { 
    $scope.availableCounties = []; 

    $http.get('/index.php/Pro/getAddresses') 
     .success(function (data) { 
      $scope.availableCounties = data; 
     }) 
     .error(function (error) { 
      // Eventually do something when request fails 
     }); 
}); 

編輯:

正如評論@kvetis狀態,這是一個很好的做法,以保持http請求在一個地方。如果你關心良好的做法,here is a fiddle演示如何簡單幹淨地做到這一點。

+0

我不同意這一點。如果您在更多地方使用相同的API調用,那麼使用服務將是一種很好的做法。 – kvetis 2015-02-10 11:34:37

+1

@kvetis是的,我完全同意你:)但是,我們只需要返回服務中的$ http請求,而不是覆蓋它的承諾系統。在這裏,我不完全確定好的做法是優先事項^^ – Deurco 2015-02-10 11:57:32

+0

是的。確實,您不必使用$ q,只需返回'$ http.get'的結果即可 – kvetis 2015-02-11 10:27:23