2016-01-30 3 views
0

Я новичок в AngularJS и имею следующий код, который мне нужно отредактировать.Переменная области доступа AngularJs в другой функции

scope.findData = []; 
scope.clientId; 
scope.identityDocuments_a = []; 


scope.getClientIdentityDocuments_a = function(clientID){ 
     resourceFactory.clientResource.getAllClientDocuments({clientId: clientID, anotherresource: 'identifiers'}, function(data){ 
       scope.identityDocuments_a = data; 
      });    
     }; 

     scope.findOptions = function(value){ 
      var i; 
      var deferred = $q.defer(); 
resourceFactory.clientResource.getAllClientsWithoutLimit({displayName: value, orderBy : 'id', officeId : scope.group.officeId, sortOrder : 'ASC', orphansOnly : true}, function (data) { 
       deferred.resolve(data.pageItems); 
        for (i = 0; i <= data.pageItems.length; i++) { 

       scope.clientId = data.pageItems[i].id; 
       scope.getClientIdentityDocuments_a(scope.clientId); 
        //<- I want to access scope.identityDocuments_a here 
       } 
       scope.findData = data.pageItems; 

       }); 
      return deferred.promise; 
     }; 

Обе эти функции находятся под одним и тем же контроллером. Я посмотрел Accessing $scope variable from another method in the same controller Angularjs, но он не работает. Где я иду не так? Заранее спасибо.

+0

С какой переменной вы не можете получить доступ? Идентификатор clientID в getClientIdentityDocuments_a()? Если это проблема, попробуйте 'clientId: scope.clientID' – Beartums

+0

Мне не удается получить доступ к области scope.identityDocuments_a. Я попробовал оповещение (scope.identityDocuments_a.toSource()); и он просто показал [] – coderGeek

ответ

1

Хорошо, я вижу проблему. Ваш getClientIdentityDocuments_a() использует функцию обратного вызова. Асинхронное извлечение данных происходит отдельно, поэтому значение не устанавливается к тому моменту, когда вы хотите его использовать. Вы можете это исправить, вернув обещание

scope.getClientIdentityDocuments_a = function(clientID){ 
     var defer = $q.defer(); 
     resourceFactory.clientResource.getAllClientDocuments(
        {clientId: clientID, 
        anotherresource: 'identifiers'}, function(data){ 
       scope.identityDocuments_a = data; 
       defer.resolve(data); 
      });    
      return defer.promise; 
     }; 

, а затем использовать эти данные в своей второй функции:

scope.getClientIdentityDocuments_a(scope.clientId).then(function(documents) { 
     // at this point, the scope.identityDocuments_a should be available, 
     // but you could just set it here, since the document variable is 
     // returning the same thing 
    console.dir(scope.identityDocuments_a) // should have the returned data 
    console.dir(documents)     // should be the same as above 
}); 
// Here, the documents will NOT be available, because this executes before 
// the promise is resolved 
console.dir(scope.identityDocuments_a) // [] or undefined 

UPDATE: Чтобы уточнить, если в getClientIdentityDocuments_a вы должны были непосредственно присвоить переменная, такая как

scope.getClientIdentityDocuments_a = function(clientID){ 
     scope.identityDocuments_a = some_document; 
}; 

Вам не понадобится обещание, и ваш код будет работать. Но поскольку вы извлекаете данные из асинхронного источника, вторая функция пытается использовать данные до того, как значение будет установлено.

+0

Привет. спасибо за Ваш ответ. Но я не совсем понимаю, что такое scope.getClientIdentityDocuments_a (scope.clientId). Then (function (document) {}); для? – coderGeek

+0

Я превратил функцию getClientIdentityDocuments_a() в обещание, которое разрешается только после асинхронного вызова, который обновляет переменную identityDocuments_a. Если вы сделаете что-либо с переменной до того, как асинхронный вызов вернет свои данные, переменная не изменится. синтаксис '.then()' может использоваться с любым обещанием вместо синтаксиса обратного вызова, и он просто ждет, пока не будет объявлено, что обещание будет разрешено (в этом случае 'defer.resolve()') до его выполнения. – Beartums

+0

Я пробовал свой код, но, к сожалению, он не работает. Я попробовал alert (scope.identityDocuments_a.toSource()); перед оператором return и показал []. – coderGeek

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