2017-02-23 12 views
0

привет, я получаю intrestedid от ng-repeat, я хочу вызвать другую службу и хранить эти данные в одной переменной динамически, потому что нужно послать отдельный api для получения изображений.angularjs: как сохранить функцию, возвращающую значение в одной переменной. на основе ng-repeat

мой HTML, это посмотреть, как этот

<div class="" ng-repeat="item in items" > 
    <div ng-init="MyPic = getMyprofile(item.interestedTo)"> 
    <img src="{{MyPic}}"> 
    </div> 
</div> 

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

$scope.getMyprofile = function(IntrstdId){ 
    appServices.profile(IntrstdId, function(response){ 
     $scope.meDetails = response.data; 
    }) 
    return $scope.meDetails; 

    } 

Мои услуги выглядят следующим образом.

service.profile= function(userId, callback) { 
    path = serviceUrl + '/profile/'+ userId; 
    $http({ 
     method: 'GET', 
     url: path 
     }).then(function(data) { 
     callback(data) 
    }, function(data) {}); 
} 

но его получение undefined, любые проблемы в этом коде.

ответ

0

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

HTML

<div ng-repeat ="data_ in parentData track by $index"> 
    <ul> 
     <li ng-repeat="result in data_.data track by $index" ng-init="counter=increaseCounter();"> 
     <div ng-model="counter"></div> 
    </ul> 
</div> 

контроллер

// It simply store variable value in scope.counter 
$scope.counter = 0; 
$scope.increaseCounter = function() { 
    var cnt = $scope.counter++; 
    return cnt; 
}; 

//Another way is to call service while update variable vaule 
$scope.counter = 0; 
$scope.increaseCounter = function() { 
    var cnt = $scope.counter++; 
    AppService.updateValue(cnt); 
    return cnt; 
}; 
+0

на самом деле я хочу передать некоторые идентификатор и хранить ответ ... счетчик = increaseCounter (result.id); –

+0

Да, вы можете передать его на службу независимо от того, что вы хотите –

+0

Еще раз дайте мне знать, где вы находите проблему. –

0
$scope.getMyprofile = function(IntrstdId){ 
    appServices.profile(IntrstdId, function(response){ 
     $scope.meDetails = response.data; 
    }) 
return $scope.meDetails; 

}

Я думаю выпуск - это функция. appService.profile - это метод asyncronize и до завершения его возврата функции $scope.meDetails;

Мое предложение - хардкор какое-то значение, как показано ниже, и посмотреть результат. если он работает, то вам необходимо соответствующим образом изменить функцию.

$scope.meDetails ='some value'; 
return $scope.meDetails; 
0

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

1. Избегайте использования ng-init, если вы не хотите повторно запускать функцию при восстановлении элемента, например ng-if. Более того, когда вы используете ng-repeat без track by, любые изменения в источнике данных будут приводить к повторному запуску всех ng-init у детей.

Решение: Запустите их, когда вы запустите контроллер, или как только $scope.items будет заполнен.

angular.forEach($scope.items, function(item) { 
    appServices.profile(item).then(function(data){ 
    item.myPic = data; 
    }); 
}); 

<div class="" ng-repeat="item in items" > 
    <img src="{{item.myPic}}"> 
</div> 

2. Правильный способ, чтобы обернуть функцию, которая возвращает обещание (которое $http есть), чтобы вернуть саму функцию. Вы можете больше узнать о том, как пройти разрешенный/отклоненный результат.

// not needed anymore, just to showcase 
$scope.getMyprofile = function(IntrstdId){ 
    return appServices.profile(IntrstdId); 
} 

// same goes with the service function 
service.profile= function(userId) { 
    path = serviceUrl + '/profile/'+ userId; 
    return $http({ 
    method: 'GET', 
    url: path 
    }).then(function(response) { 
    return response.data; 
    }); 
} 
+0

Привет, спасибо большое, 1.) работает для меня ... около 2.) $ scope. getMyprofile = function (IntrstdId) { return appServices.profile (IntrstdId); }Я пробовал это, но не получил какое-либо возвращаемое значение в «$ scope.getMyprofile» всегда показывал пусто {} –

+0

Вы не можете получить немедленный результат с помощью этой функции, вам нужно использовать его в своем контроллере, написав '$ scope .getMyprofile (id) .then (function (data) {// что вы хотите сделать здесь}) ' – Icycool

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