2016-08-21 2 views
0

У меня есть AngularJS 1.5 директивы в:Как установить переменную в обратном вызове AngularJS?

var assetSearchService = function(proService) { 
    var assets = []; 

    var searchAssets = function(searchTerm){ 
     proService.searchAssets(searchTerm).then(function(data){ 
      assets = data.data; 
     }); 
    }; 

    return { 
     searchAssets, searchAssets, 
     assets: assets 
    }; 
}; 

Когда я пытаюсь использовать assetSearchService.assets в мой контроллер после вызова поиска, данные не установлены в assetService.assets.

Если я зарегистрирую данные после возврата searchAssets, я получаю данные.

this.assets не работает, так как мне получить переменную от обратного вызова?

+1

вместо * замена * 'assets' внутри обратного вызова, вы должны подталкивать данные в существующий массив. try 'assets = assets.concat (data.data);' – Claies

+0

Нет, активы не ссылаются на первоначально объявленные активы var. – mikeb

+1

он делает, но вы заменяете его внутри обратного вызова с помощью другого массива, который разбивает угловые привязки. – Claies

ответ

1

Найден ответ. Ни assets = newArray, ни conact не работают, потому что оба возвращают новый массив и нарушают ссылку, а не изменяют текущий.

Это работает:

Array.prototype.push.apply(assets, data.data);

Вот рабочий пример: https://jsfiddle.net/mbaranski/5k4bqo0z/

0

Вы можете достичь более сложное решение

var assetSearchService = function(proService) { 
    service = this; 
    service.assets = []; 

    service.searchAssets = function(searchTerm){ 
    proService.searchAssets(searchTerm).then(function(data){ 
     assets.push(data.data); 
    }); 
    }; 

    return service; 
}; 
+0

Это не отвечает на вопрос, потому что вся проблема заключается в освобождении массива 'assets' и добавлении каждого элемента из' data.data' в новый массив. – mikeb