2016-08-17 2 views
2

저는 Angular에 아직 익숙하지 않아 바보 같은 질문이 있으면 사과드립니다 ... transclusion을 사용하는 사용자 지정 지시문이 있습니다. 데이터가 작품을 바인딩 왜 부모 요소에 NG-컨트롤러를 할당하면,하지만 난 그것에 직접 컨트롤러를 할당 할 때 이해하기 :transclusion을 사용하는 사용자 지정 지시문에서 ng-controller의 각도 범위

코드 :

angular.module('HelloWorld', []) 

.controller('HelloController', function($scope) { 
    $scope.name = 'you' 
}) 

.directive('hello', function() { 
    return { 
    restrict: 'E', 
    transclude: true, 
    template: '<ng-transclude />' 
    }; 
}); 

HTML :

<!-- why does this one work? --> 
<div ng-controller="HelloController"> 
    <hello>Hi there, {{name}}!</hello> 
</div> 

<!-- but not this one? --> 
<hello ng-controller="HelloController"> 
    <p> Hi there, {{name}}!</p> 
</hello> 

Plunker : https://plnkr.co/edit/ICztHcKU4W2EgFmy8OqQ?p=preview

어떤 아이디어?

답변

0

지시문은 요소로 컴파일 된 개체 (템플릿, 바인딩, 컨트롤러 및 기타 속성 포함)를 반환하는 함수로 정의됩니다.

요소 안에 넣은 속성은 지시문 바인딩 (또는 격리 된 범위)으로 전달되지만 해석되지 않습니다.

컨트롤러를 기술적으로 지시어에 특성으로 전달할 수 있지만 지시문에 컨트롤러 속성이 있으므로 올바른 방법이 아닙니다.

예를 들어이 작동합니다 : https://plnkr.co/edit/WknbSDI4HlQyp2vQIkbR?p=preview

angular.module('HelloWorld', []) 

.controller('HelloController', function($scope) { 
    $scope.name = 'you' 
}) 

    .directive('hello', function() { 
     return { 
     restrict: 'E', 
     scope: { 
      ngController: '&' 
     }, 
     transclude: true, 
     template: '<ng-transclude />', 
     controller: ngController 
     }; 
    }); 

그러나 당신은 당신이 직접 더 독립적으로 만들 것 지시어 내부

controller: function() {} 

를 사용할 수 있습니다 참조하십시오.

+0

알겠습니다 ... 감사합니다. 이 경로를 시작한 원래의 이유는 Angular Material의 md-button 지시문 (https://material.angularjs.org/latest/api/directive/mdButton)을 사용하고 ng 컨트롤러를 하나의 데이터에 할당하려고했기 때문입니다 그것의 제목에 묶어 라. - 내가 컨트롤러를 수평 위로 올릴 때까지 제목이 나타나지 않았다. 그런 종류의 유스 케이스가 단지 일반적으로 예상되지 않거나 추천 된 것일까 요? – chinabuffet

+0

컨트롤러가 HTML 요소를 제어합니다. 컴파일 전에 지시문 (제한 E 포함)은 HTML 요소가 아닙니다. 지시어의 속성으로 컨트롤러를 전달하는 것은 바람직하지 않습니다. 왜냐하면 여러분은 코드를 가지고있을 것이기 때문입니다. – gyc

+0

@chinabuffet 컨트롤러 (구성 요소와 유사)를 가지고 지시문을 필요로하고 더 독립적이고 재사용 가능하도록 만들려면 controller 속성을 사용하십시오. – gyc