2013-04-15 6 views
0

До сих пор у меня нет проблемы с настройкой модели AngularJS в моем приложении Rails и предоставлением ей данных для доступа к интерфейсу. Я даже настроил его на заполнение данными из запроса AJAX, используя $http. Однако мне нужна эта модель, чтобы содержать данные нескольких вызовов $http. Вот код, который я получил до сих пор:Как добавить дополнительные данные в модель AngularJS?

function DropboxCtrl($scope, $http) { 
    var $infiniteLoader = $(".infiniteLoader"); 
    var theUIDS = $infiniteLoader.attr('data-dropbox-uids').split(','); 

    if($infiniteLoader.attr('data-dropbox-uids') != "") { 
     var theData = {}; 

     $.each(theUIDS, function(key) { 
      $http({ url: '/dropbox/files/get', method: 'GET', params: { uid: theUIDS[key] }}).success(function(data) { 
       theData = data; 
      }); 
     }); 

     $scope.dropboxes = theData; 
    } 
} 

У меня есть метод, называемый DropboxCtrl, который будет начать получать все UID о том, что мне нужно вызвать запрос GET на. Я прокручиваю каждый из них, а затем добавляю data в theData, который является объектом Javascript. После каждого из них я делаю модель dropboxes равной значению theData. Current У меня есть метод, который абсолютно ничего не возвращает и никаких ошибок Javascript. Я уверен, что мой URL работает полностью и на самом деле получить код работает только с одной просьбой AJAX, как, например:

$.each(theUIDS, function(key) { 
    $http({ url: '/dropbox/files/get', method: 'GET', params: { uid: theUIDS[key] }}).success(function(data) { 
     $scope.dropboxes = data; 
    }); 
}); 

Однако ... что блок кода возвращает только последний вызов AJAX, так как остальные будут перезаписаны. Возможно, то, что мне не хватает, - это просто неправильный Javascript, однако, возможно, то, что мне не хватает, - это просто непонимание «углового пути» вещей. Я учусь в Javascript и jQuery, но очень новичок в Angular. Любая помощь?

ответ

3

AngularJs - это структура Javascript высокого уровня. Код в конечном счете - javascript. В ваших $ каждые, вы можете нажать результаты в массив или к инициализированным коллекциям как

$scope.dropboxes = [{uid:1234}, {uid:2345}] and so on. 

в пределах $ каждого, найдите запись для UID и приложить результаты. Я обычно использую underscorejs библиотеку для операций на коллекции, массивы и т.д. так что-то вроде

_.findWhere($scope.dropboxes, {uid: data.uid }).data = data; 

принимая данные, возвращаемые имеет идентификатор пользователя в нем. Если нет, тогда должен быть другой способ сопоставить результаты с запросом. Обратите внимание, что нет гарантии порядка ответов, поэтому вы не можете использовать индексы массива для сопоставления результатов.

+0

Простите мое невежество, я немного новичок в Angular (и никогда не использовал UnderscoreJS), не могли бы вы дать мне немного контекста? Я не совсем понимаю ваш ответ. – cereallarceny

+0

Все, что я пытаюсь сказать, это то, что вам нужно сопоставить свои ответы с соответствующим запросом. Поскольку вы выполняете более одного асинхронного вызова, и порядок ответа не гарантируется, вам нужно будет найти способ вернуть ответ обратно в соответствующий элемент запроса в коллекции. Underscore - это просто библиотека javascript, которая предоставляет полезные функции для поиска, фильтрации и т. Д. В коллекциях и массивах. Вам действительно не нужно его использовать, это просто полезно. – Ketan

+0

Важно помнить 1. Инициализируйте коллекцию объектов, которые будут иметь ваш uid как свойство, прежде чем совершать какие-либо вызовы. 2. В пределах цикла $ each выше, когда вы получите ответ, найдите элемент в этой коллекции на основе uid и затем присоедините ответ к этому элементу в свойстве data. 3. Когда вы получите ответы на все ответы, у вас будет коллекция объектов с uid и данными как 2 свойства. – Ketan

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