2015-01-18 6 views
-1

저는 google-places 지시문을 사용하고 있지만 모든 사항이 정상 이었지만 갑자기 변수 $ scope.location이 컨트롤러에 정의되어 있지 않습니다. 그러나보기에서 그것은 사용할 수 있습니까?

무엇이 잘못 되었나요? 보기에서 감사

yuppiApp.directive('googlePlaces', function(){ 
    return { 
     restrict:'E', 
     replace:true, 
     scope: {location:'='}, 
     template: "<input id='google_places_ac' ng-model='google_map' name='map' type='text' required/>", 
     link: function($scope, elm, attrs){ 
      var autocomplete = new google.maps.places.Autocomplete($("#google_places_ac")[0], {}); 
      google.maps.event.addListener(autocomplete, 'place_changed', function() { 
       var place = autocomplete.getPlace(); 
       $scope.location = place.geometry.location.lat() + ',' + place.geometry.location.lng(); 
       console.log($scope.location); 
       $scope.$apply(); 
      }); 
     } 
    } 
}); 

코드 : 컨트롤러에서

{{ location }} 

<google-places location="location"></google-places> 

코드 : 내가 지시와 컨트롤러 두 경우 모두 CONSOLE.LOG ($ 범위)라고

$scope.addNew = function() { 
    console.log("Location: " + $scope.location); 
}; 

는과 보인다 거기에 $ 범위의 두 가지 버전이 있습니다. 나는 왜 그런지 이해하지 못한다.

Object { $id: "0U8", $$childTail: null, $$childHead: null, ....... 
Object { $id: "00M", this: Object, $$listeners: Object 
+0

$ scope.location을 다른 곳에서 만들거나 할당하지 않으시겠습니까? –

+0

버튼 클릭을 호출하는 컨트롤러 기능에서 사용하고 있습니다. 전에는 작동하지만 정확히 무엇이 바뀌 었는지는 알 수 없습니다. 나는 아직 완전히 새로운 것은 아니지만 완전히 새로운 것이다. –

+0

양방향 바인딩을 사용하지 않을 때 왜'location = "location"'을해야합니까? – PSL

답변

2

이 지시문을 템플릿의 다른 지시문에서 사용해야하며 해당 지시문이 하위 범위를 작성해야합니다. 그런 다음 두 개의 스코프로 끝나고 googlePlaces 지시문을 컨트롤러에 직접 액세스 할 수 없으며 자식 범위에 씁니다.

은 다음과 같이 코드를 변경

:보기에서

yuppiApp.directive('googlePlaces', function(){ 
    return { 
     restrict:'E', 
     scope: { 
      location: '=' 
     } 
     ... 

코드 : 컨트롤러에서

{{ data.location }} 

<google-places location="data.location"></google-places> 

코드 :

고립 범위되기 위해 당신의 지시에 다시 위치를 추가

$scope.data = { 
location: null 
}; 

이렇게하면 두 스코프 모두 동일한 객체 변수를 공유하게됩니다. 이것은 tht '점'규칙이 적용된 것입니다 (모든 바인딩에는.이 있어야합니다).

컨트롤러에 대한 controllerAs 구문과 지시문에 대한 격리 된 범위에 대해 배우는 것이 좋습니다.

+0

고마워, 이제 작동한다. 그러나 나는 그 차이점을 이해하지 못합니다. 나는 컨트롤러에 대해 읽은 후 모든 것이 명확 해지기를 바랍니다. –

+0

이 문제를 범위 상속이라고합니다.확실히, controllerAs는 이런 종류의 문제를 막는 간단하고 효과적인 방법입니다 (초보자에게는 함정입니다). –

+0

@Werlang fyi .. 양방향 바인딩을 사용할 때 반드시 도트 룰을 보장 할 필요는 없습니다. 양방향 바인딩. 그러나 그것에 관한 까다로운 점은 양방향 바인딩 된 속성을 업데이트하는 다이제스트주기 후에 만 ​​소비 된 범위 속성이 업데이트되는 것을 볼 수 있다는 것입니다. 여기서 가장 좋은 방법은 'ng-model'을 사용하고 viewValue를 설정하는 것입니다. 'onPlaceChanged'라고하는 함수 바인딩을 사용하고 모델을 설정 한 후에 그것을 트리거하십시오. _ 청결 계약은 당신이 그 _ – PSL

관련 문제