2016-03-04 5 views
0

Я знаю, что эта проблема уже упоминалась несколько раз раньше, но я не мог заставить меня работать ни на одно из этих решений.

В моем контроллере у меня есть функция, которая предназначена для вызова из цикла ng-repeat. Ng-repeat выполняет итерацию по списку серверов, и эта функция вызывается с помощью метода в представлении, чтобы получить некоторые данные среды об этом сервере.

Эта функция, кажется, является корнем проблемы, но я не могу понять, как ее исправить.

Функция контроллера:

function getServHead(data) { 
    SearchFactory.servHeader(data).then(
     function (response) { 
      $log.info(response); 
      vm.searchData.server.sh = response; 
      return vm.searchData.server.sh; 
     }, 
     function (error) { 
      $log.error('Error getting server header data', error); 
      vm.getTeamHeadInfoError = 'Error retrieving server header data'; 
     }) 
} 

Вот пример данных, я получаю обратно:

{ 
    "name": "dcsql01", 
    "isVirtual": false, 
    "os": "Windows", 
    "isInDMZ": false 
} 

Как я звоню с точки зрения:

<tr ng-repeat="server in vm.searchData.server"> 
    <td> 
    <a href="/server/{{server.Name}}"> 
    {{vm.getServHead(server.AssetID)}} 
    <span ng-if="vm.searchData.server.sh.isVirtual == true" class="fa fa-cloud fa-lg"> </span> 
    <span ng-if="vm.searchData.server.sh.isVirtual != true"class="fa fa-tasks fa-lg"> </span> 
    <span ng-if="vm.searchData.server.sh.isInDMZ == true" class="fa fa-user-secret fa-lg"> </span> 
    <span ng-if="vm.searchData.server.sh.isInDMZ != true" class="fa fa-university fa-lg"> </span> 
    <span ng-if="vm.searchData.server.sh.os == 'windows' || 'Windows'" class="fa fa-windows fa-lg"> </span> 
    <span ng-if="vm.searchData.server.sh.os == 'linux' || 'Linux'" class="fa fa-linux fa-lg"> </span> 
    {{server.Name}}</a> 
    </td> 
    <td> 
    <td> <span class='health'>100</span> </td> 
    </td> 
</tr> 

Я ve попытался вернуть ответ GET, например, страницу с угловыми подсказками для этой ошибки, и попробовал различные другие ответы SO на эту вопрос, но я все еще сталкиваюсь с той же проблемой.

Если кто-то может дать некоторое представление о том, что я делаю неправильно, было бы весьма полезно.

EDIT:

сервера список вызовов в контроллере:

function getServers() { 
    SearchFactory.getServer(searchID).then(
     function (response) { 
      $log.info(response); 
      vm.searchData.server = response; 
     }, 
     function (error) { 
      $log.error('Error getting server search data', error); 
      vm.getServerInfoError = 'Error retrieving server search data'; 
     }) 
} 

Это выполняется при инициализации и передает то, что в Params (searchID) к API, который возвращает базовый массив объектов сервера.

+0

Действительно плохая идея инициализации Ajax запросов от функции вида. Сначала эта функция ничего не возвращает, и она будет вызываться как минимум дважды за цикл дайджест за каждый повторяющийся элемент. Должно быть сделано в сочетании с другим запросом данных в службе – charlietfl

+0

Сбивание с толку, какая цель с тех пор, как каждый запрос 'getServHead()' перезаписывает весь объект 'vm.searchData.server.sh' – charlietfl

+0

Таким образом, функция возвращает запрошенные данные, переходит в бесконечный цикл. Я решил, что возвращенный объект просто перезапишет каждый звонок и будет в порядке, но, очевидно, это не так. Что было бы лучше? –

ответ

0

Для начала фактические данные в then(response) содержатся в response.data.

следующие будут заполнять данные головы в свойстве server.sh для Чеха сервера в повторе

function getServers() { 
    return SearchFactory.getServer(searchID).then(function(response) { 
     $log.info(response.data); 
     vm.searchData.server = response.data; 
     return vm.searchData.server; 
    }, 
    function(error) { 
     $log.error('Error getting server search data', error); 
     vm.getServerInfoError = 'Error retrieving server search data'; 
    }) 


} 


getServers().then(function(servers) { 

    servers.forEach(function(server) { 
    var id = server.AssetID; 
    SearchFactory.servHeader(id).then(function(response) { 
     $log.info(response); 
     server.sh = response.data; 

     }, 
     function(error) { 
     $log.error('Error getting server header data', error); 
     vm.getTeamHeadInfoError = 'Error retrieving server header data'; 
     }); 

    }); 

}); 

Если вы хотите все Дат извлекаться, прежде чем передать его мнению вам необходимо будет создать массив обещаний и использовать $q.all()

Пример изменения представления будет:

Изменить

<span ng-if="vm.searchData.server.sh.isVirtual == true" class="fa fa-cloud fa-lg"> </span> 

Для

<span ng-if="server.sh.isVirtual == true" class="fa fa-cloud fa-lg"> </span> 
Смежные вопросы