2013-09-11 3 views
1

У меня есть контроллер AngularJs:контроллер Initialize по запросу АЯКС

function MyController($scope, $http) { 
    // as $http.get() is async, success() returns promise but 
    // I need the actual value 'items' 
    var promise = $http.get(...) 
     .success(function(response) {return response.items;}); 
    <waitForAjaxCall> 
    $scope.items = promise.get?(); 
    $scope.firstItem = $scope.items[0]; 

    //do stuff using $scope.firstItem 
} 

var myApp = angular.module('myApp',[]); 
myApp.controller('MyController', ['$scope', '$http', MyController]); 

Как я могу гарантировать, что $scope.items инициализируется значением, возвращаемым вызовом АЯКС перед $scope.firstItem = ... задания? Другой подход, который я вижу, состоит в том, чтобы обернуть items в фабрику angularjs, которая вызывает $ http, но мне все еще нужно ждать, пока вызов ajax будет завершен внутри этой фабрики.

+1

Почему бы просто не установить значение $ scope.items в результате успешного выполнения обещания? – Sneaksta

+0

@Sneaksta adaiu, в этом случае $ scope.firstItem может относиться к неинициализированному значению – Nutel

+0

Ah right. Не вижу ссылки на $ scope.items на следующей строке, извините. Ну, не могли бы вы просто определить $ scope.firstItem в обратном вызове успеха? – Sneaksta

ответ

1

Вы не можете ждать синхронно для завершения вызова Ajax. Вы должны инициализировать сферу в success обратного вызова:

function MyController($scope, $http) { 
    function init(items) { 
     $scope.items = items; 
     $scope.firstItem = $scope.items[0]; 

     //do stuff using $scope.firstItem 
    } 

    $http.get(...) 
     .success(function(data) { 
      init(data.items);    
     }); 
} 
0

Я бы на самом деле просто сделать это:

<div>{{items[0].name}}</div> 

Когда $scope.items установлен, первый элемент будет связан там.

+0

Мне показалось, что я звоню, потому что я выбрал этот подход, потому что он не позволяет контроллеру беспокоиться о том, как/когда он получает данные. Такова идея предоставления услуг, поэтому я говорю, оставляю их им и позволяю контроллеру беспокоиться о своих проблемах (привязка данных). – m59

+0

это очень близко к тому, что мне нужно, просто еще одно уточнение: '$ scope.firstItem' - объект обещания, и в вашей демонстрации это значение используется как {{firstItem}}, так как я понимаю угловые обновления значения внутри' { {}} 'автоматически и использует значение, инкапсулированное обещанием вместо самого обещания, верно ?. Кроме того, если это объект обетования, как я могу прочитать значение firstItem внутри контроллера, я не могу просто выполнить команду var myItemName = $ scope.firstItem.getItemName() '... – Nutel

+0

@Nutel Woaaah, что сбивает с толку. На самом деле все это глупо. Почему бы просто не связать вещи? '

{{items[0].name}}
' и игнорировать '$ scope.firstItem' вообще? – m59

Смежные вопросы