2016-09-07 2 views
1

안녕하십니까. $ scope에 바인드하려면 루프 외부에 필요한 angular.forEach 루프 내부에 변수를 만들었지 만,이 변수를 벗어나는 방법을 모르겠습니다. 변수 miAlumno.전역 변수에 angular.forEach 루프에 로컬 변수를 넣으십시오.

감사합니다.

'use strict'; 

angular.module('jarciaApp') 
    .controller('alumnoCtrl', function($routeParams, $firebaseArray) { 

     var ref = firebase.database().ref('PrimeroA'); 

     var JarciaArray = $firebaseArray(ref); 

     var id = $routeParams.id; 

     var curso = $routeParams.curso; 

     var miAlumno; 


     JarciaArray.$loaded() 
      .then(function(miAlumno) { 
       angular.forEach(JarciaArray, function(alumno, miAlumno) { 
        if (alumno.Id == id) { 
         var miAlumno = alumno; 
        } 
       }) 
      }); 

     console.log(miAlumno); 
    }); 
+0

내부에'var'을 사용하지 마십시오 ('miAlumno'를 재정의했습니다). 그러나'$ load()'가 비동기이기 때문에'console.log'가있는 곳에서도 값을 기록하지 않습니다. '$ scope'를 삽입하면 루프 내에서'$ scope.miAlumno'를 할 수 있습니다. –

+0

나는 '컨트롤러'라고 불리는 방법을 모르므로 $ 범위를 삽입하지 않습니까? this.variable = ....을 사용하여 범위에 데이터를 바인딩합니다. 하지만 루프 내부에서 사용할 수 없으므로 루프 내부에서 사용할 수 없습니다. –

+0

좋아요, 그 다음 루프 바깥쪽에'var me = this;'를 추가하고'me.miAlumno = alumno;'를 루프에 추가하십시오. 스페인어로 말하면'var esto = this;'가 더 좋습니다 :) . –

답변

0

변수 miAlumno를 루프에 선언하지 마십시오. 밖에서 선언하면 눈에 띄게됩니다. 그 console.log (miAlumno)에서주의를 기울이십시오. 아마도 비동기 할당 때문에 항상 null이 될 것입니다.

+0

루프 내부에서 var 키워드를 제거했지만 루프 외부의 변수 miAlumno는 내부 루프 값을 수신하지 않습니다. –

+0

inside 루프는 비동기식이므로 루프를 실행 한 후에 만 ​​외부 값을 확인해야합니다. 확실합니까? –

0

올바르게 이해하면 해당 함수의 범위를 벗어난 함수에 전달한 alumno 변수를 사용하고 싶습니까?

miAlumno처럼 함수 외부에서 전역 변수를 작성/선언 한 다음 함수에서 생성 한 값에 전역 변수를 할당하면됩니다. 또한 miAlumno을 두 번 선언 했으므로 한 번은 전역으로, 그 다음 for 루프 내부로 선언하십시오.

내가 오해한다면 사과드립니다. 그렇다면 정교하게 기재하십시오.

+0

그 exacly 나는 외부 변수 miAlumno를 만들고이 전역 변수에 대한 루프 안의 졸업생을 시험하려고한다면, 아무 일도 일어나지 않습니다. miAlumno는 정의되지 않은 상태로 남아 있습니다. –

0

ControllerAs 구문을 사용하는 것처럼 들리는데, 이는 전통적으로 범위 변수가 자동으로 컨트롤러의 속성으로 바인딩된다는 것을 의미합니다. 당신은 단순히 this의 캐시 된 값을 사용하여 루프의 내부 변수를 설정할 수 있습니다 : 나는 또한 then 기능과 forEach에 대한 콜백 miAlumno를 전달하는 추가 시도를 제거했습니다

'use strict'; 

angular.module('jarciaApp') 
    .controller('alumnoCtrl', function($routeParams, $firebaseArray) { 

     var ref = firebase.database().ref('PrimeroA'); 

     var JarciaArray = $firebaseArray(ref); 

     var id = $routeParams.id; 

     var curso = $routeParams.curso; 

     var me = this; 

     JarciaArray.$loaded() 
      .then(function() { 
       angular.forEach(JarciaArray, function(alumno) { 
        if (alumno.Id == id) { 
         me.miAlumno = alumno; 
        } 
       }); 
       // This will work to show the value 
       console.log(me.miAlumno); 
      }); 

     // This still won't work, since $loaded is asynchronous 
     console.log(this.miAlumno); 
    }); 

을; 그것들은 불필요합니다.

console.log에 대한 의견을 참고하십시오. 나는 $loaded()이 비동기식이라고 믿는다; 따라서 실제로 완료되는 프로세스가 완료 될 때까지 설정되지 않습니다. logthen() 내부로 이동하면 결과가 표시됩니다.

관련 문제