2015-07-16 3 views
0

У меня есть небольшое угловое приложение с директивой. Для извлечения данных с serveride я использую ngRoute. После retriving данных я связываю привести к свойству объема и проанализировать результат с нг-повтора так:Как передать аргументы в обещание в AngularJS

<div class="col-xs-12" ng-repeat="clsRow in classificatorData"> 
    <span>{{clsRow.code}}</span> 
</div> 

Эта функция, которая retrievs данные из ресурса

var getClassificatorDataScope = function (criteria, predicate) { 
       references.initialize('classificators'); 
       references 
        .getRefereces(null, $scope.classificatorType, criteria, predicate == null ? "NONE" : predicate, $scope.limitLevel, null) 
        .$promise.then(function (result) { 
         $scope.classificatorData = result.Data; 
        }); 


      }; 

Все работает отлично. Но если я пытаюсь осуществить прохождение контейнера данных результата (ДатаСкоп) как так

var getClassificatorDataScope = function (criteria, predicate, dataScope) { 
       references.initialize('classificators'); 
       references 
        .getRefereces(null, $scope.classificatorType, criteria, predicate == null ? "NONE" : predicate, $scope.limitLevel, null) 
        .$promise.then(function (result) { 
         dataScope = result.Data; 
        }); 


      }; 

и использовать его в контроллере, как так

getClassificatorDataScope("CODE", null, $scope.classificatorData); 

У меня нет никаких данных вообще. Пожалуйста, помогите мне понять такое поведение.

ответ

2

Там в 2 проблемы здесь.

dataScope = result.Data; 

Первый такой. Это не так, как вы ожидали. Он не заменяет $scope.classificatorData. Все это заменяет локальную переменную dataScope в getClassificatorDataScope на result.Data (да, это не «передано по ссылке»).

Во-вторых, вы используете обещания неправильно. You верните обещание для прослушивания, а не передать область кому-знает-где. Ваш уровень данных не должен знать о $scope или в общем интерфейсе. Верните обещание контроллеру и попросите его прослушать данные.

// In your function 
var getClassificatorDataScope = function(criteria, predicate) { 
    references.initialize('classificators'); 
    return references 
    .getRefereces(null, $scope.classificatorType, criteria, predicate == null ? "NONE" : predicate, $scope.limitLevel, null) 
    .$promise 
}; 

// In your controller 
getClassificatorDataScope("CODE", null).then(function(result){ 
    $scope.classificatorData = result.Data; 
}); 
+0

Уважаемый Иосиф. Не могли бы вы объяснить, почему - это не «передать ссылку»? Я думал, что кузнец поможет в этом деле. – Anton

0

Проблема может быть в вашем методе reference.getRefereces. Он должен вернуть обещание и позже разрешить его с правильным результатом (я вижу, вы пытаетесь получить доступ к атрибуту «Данные» из результата.). что-то вроде этого:

reference.getReferences = function() { 
     var deferred = $q.defer(); 
     someAsyncOperations(function callback(){ 
      deferred.resolve({Data: result}) // make sure you have the "Data" attr 
     }) 
     return deferred.promise; 

// or if someAyncOperations already return a promise 
// return someAsyncOperations.then(function(result) { 
// return {Data: result}; 
// }); 
    } 
0

Кажется, что во втором примере вы пытаетесь присвоить данные, полученные от сервера к dataScope, но так как AJAX загрузка данных asynchronoys так $promise будет решен позже, чем ваш шаблон с ng-repeat рисуется.

В этом примере недостаточно кода, чтобы написать весь пример - как он должен быть реализован. Но в основном вы должны вернуть $promise от службы и изменения контроллера $ области видимости переменных на

promise.then(function() { 
//do stuff with $scope variables 
}) 
Смежные вопросы