Angular 지시어 확장


114

타사 지시문 (특히 Angular UI Bootstrap )을 약간 수정하고 싶습니다 . pane지시문 의 범위에 추가하고 싶습니다 .

angular.module('ui.bootstrap.tabs', [])
.controller('TabsController', ['$scope', '$element', function($scope, $element) {
  // various methods
}])
.directive('tabs', function() {
  return {
    // etc...
  };
})
.directive('pane', ['$parse', function($parse) {
  return {
    require: '^tabs',
    restrict: 'EA',
    transclude: true,
    scope:{
      heading:'@',
      disabled:'@' // <- ADDED SCOPE PROPERTY HERE
    },
    link: function(scope, element, attrs, tabsCtrl) {
      // link function
    },
    templateUrl: 'template/tabs/pane.html',
    replace: true
  };
}]);

그러나 나는 또한 Bower와 함께 Angular-Bootstrap을 최신 상태로 유지하고 싶습니다. 를 실행하자마자 bower update변경 사항을 덮어 씁니다.

그렇다면이 bower 구성 요소와 별도로이 지시문을 확장하려면 어떻게해야합니까?


2
깨끗한 방법은 사용하는 것 $provide.decorator(), 내 대답은 아래를 참조하십시오.
Eliran Malka 2014

답변:


96

아마도 이것을 해결하는 가장 간단한 방법은 타사 지시문과 동일한 이름으로 앱에 지시문을 만드는 것입니다. 두 지시문이 모두 실행되며 priority속성을 사용하여 실행 순서를 지정할 수 있습니다 (우선 순위가 높은 것이 먼저 실행 됨).

두 지시문은 범위를 공유하며 지시문의 link메소드 를 통해 타사 지시문의 범위에 액세스하고 수정할 수 있습니다 .

옵션 2 : 또한 동일한 요소에 임의로 명명 된 지시문을 배치하여 타사 지시문의 범위에 액세스 할 수도 있습니다 (두 지시문 모두 격리 범위를 사용하지 않는다고 가정). 요소의 모든 비 격리 범위 지시문은 범위를 공유합니다.

추가 자료 : https://github.com/angular/angular.js/wiki/Dev-Guide%3A-Understanding-Directives

참고 : 이전 답변은 지침이 아닌 타사 서비스를 수정하기위한 것이 었습니다.


3
감사합니다 @ sh0ber, 이것이 내가 필요한 것입니다. 그리고 이전 답변도 제 3 자 서비스에 도움이되었습니다.
Kyle

이 대답은 정말 좋지만 지시문의 "우선 순위"속성에 대한 문서를 찾을 수 없습니다. 내가 찾은 것은 "당신은 그것을 사용할 수있다"는 문구 였지만 실제 예제는 찾을 수 없습니다.
Ciel 2014 년

2
@Ciel 지시어 API 정보가 여기$compile 문서 로 분명히 옮겨졌습니다
Dan

60

TL; DR-gimme tha demo!


     Big Demo Button     
 


사용 $providedecorator(), 음, 제 3 자의 지시를 장식합니다.

이 경우 지시문의 범위를 다음과 같이 확장 할 수 있습니다.

app.config(function($provide) {
    $provide.decorator('paneDirective', function($delegate) {
        var directive = $delegate[0];
        angular.extend(directive.scope, {
            disabled:'@'
        });
        return $delegate;
    });
});

먼저, 첫 번째 인수로 pane연결된 이름을 전달 하여 지시문 을 장식하도록 요청한 Directive다음 콜백 매개 변수 (해당 이름과 일치하는 지시문의 배열)에서이를 검색합니다.

일단 우리가 그것을 얻었 으면, 우리는 그 범위 객체를 얻고 필요에 따라 그것을 확장 할 수 있습니다. 이 모든 작업은 config블록 에서 수행되어야합니다 .

일부 메모

  • 동일한 이름의 지시문을 추가 한 다음 우선 순위를 설정하는 것이 좋습니다. 의미가없는 것 외에도 ( 단어도 아님 ...) 문제가 발생합니다. 예를 들어 타사 지침의 우선 순위 수준이 변경되면 어떻게됩니까?

  • JeetendraChauhan은이 솔루션이 버전 1.13에서 작동하지 않을 것이라고 주장했습니다 (하지만 테스트하지는 않았습니다).


1
@ sh0ber의 답변을 제공하는 것이 좋습니다 (이벤트를 생성하기위한 다른 지시문 생성).
Eliran Malka 2014 년

2
(잘 작동)이 답변에 대한 빠른 노트 'paneDirective'의 '지침'는 목적을 가지고있다 ;-) 그것은 그 파악하기 전에 나에게 동안을했다 : stackoverflow.com/questions/19409017/...를 , 허용 참조 대답.
Roy Milder

2
안녕하세요 내 plunker을 확인 @EliranMalka plnkr.co/edit/0mvQjHYjQCFS6joYJdwK는 희망이 의지 도움말 사람
지트 앤드 라 차우

1
에 대한 링크 decorator()가 끊어졌습니다 ( docs.angularjs.org/api/auto/service/$provide#decorator로 업데이트 됨 )
Chris Brown

1
@EliranMalka 예, bindToControllerv1.3에서 도입되었습니다. 그러나 이것은 대체 솔루션으로 간주되지 않습니다. 이것은 원래 지시문이 bindToController속성 으로 설정된 특정 경우에만 해당 됩니다. 좋은 생각, 내가 대답 :)으로이를 게시 할 예정입니다
길 라드 mayani

8

이것이 귀하의 질문에 대한 직접적인 대답은 아니지만 http://angular-ui.github.io/bootstrap/ 의 최신 버전 (마스터)이 탭 비활성화에 대한 지원을 추가 했음을 알고 싶을 수 있습니다 . 이 기능은 https://github.com/angular-ui/bootstrap/commit/2b78dd16abd7e09846fa484331b5c35ece6619a2를 통해 추가되었습니다.


헤드 업에 +1. 알아 둘만 한. 나는 bower의 angular-bootstrap과 angular-ui의 부트 스트랩 구성 요소가 동기화되지 않은 것 같습니다.
Kyle

6

원래 지시문을 수정하지 않고 확장하는 새 지시문을 만드는 또 다른 솔루션

솔루션은 데코레이터 솔루션과 유사합니다.

새 지시문을 만들고 확장하려는 지시문을 종속성으로 삽입하십시오.

app.directive('extendedPane', function (paneDirective) {

  // to inject a directive as a service append "Directive" to the directive name
  // you will receive an array of directive configurations that match this 
  // directive (usually only one) ordered by priority

  var configExtension = {
     scope: {
       disabled: '@'
     }
  }

  return angular.merge({}, paneDirective[0], configExtension)
});

이렇게하면 동일한 앱에서 원래 지시문과 확장 버전을 사용할 수 있습니다.


2
이것은 내 자신의 변수로 격리 범위 지시문을 확장하는 데 필요한 것입니다! angular.extend는 개체를 딥 복사하지 않으므로 paneDirective의 범위 개체를이 개체로 바꿉니다. 대안은 PaneDirective에서 원래 범위를 유지하고 여기에 정의 된 변수를 추가 / 병합하는 angular.merge입니다.
mathewguest 2017

1
네, angular.merge제가 예를 업데이 트됩니다, 사용되어 있어야합니다
kidroca

1

다음은bindToController 속성 이있는 지시문에 바인딩을 확장하는 다른 시나리오에 대한 또 다른 솔루션 입니다 .

참고 : 이것은 여기에 제공된 다른 솔루션의 대안이 아닙니다. 원래 지침이 bindToController.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.