2014-03-12 2 views
8

가능한 경우 Angular의 입력 지시문을 확장하는 것이 궁금한가요? 페이지의 모든 입력 필드에 일부 리스너를 연결하려고합니다. 나는 당신이 $provide.decorate으로 기존 모듈을 장식 할 수 있다고 생각하지만, 나는 지시어 (그리고 더 정확하게는 입력 지시어)로 이것을 어떻게하는지 모른다.AngularJS : extend input directive

그럼, 누가 올바른 방향으로 나를 밀 수 있습니까? 몇 가지 예가 있습니까?

내보기에서
angular.module('onFocusBlur'). 
directive('onFocusBlur', ["$rootScope", function($rootScope) { 
    return { 
    restrict: "A", 
    link: function(scope, elem, attrs) { 
     elem.bind('focus',function() { 
      scope.$apply(function() { 
      $rootScope[attrs.onFocusBlur] = true; 
      }); 
     }); 
     elem.bind('blur',function() { 
      scope.$apply(function() { 
      $rootScope[attrs.onFocusBlur] = false; 
      }); 
     }); 
    } 
    }; 
}]); 

, 나는이 같은 입력 필드에이를 추가 할 수 있습니다 :

<input type="email" ng-model="email" on-focus-blur="repositionNavBar"> 

여기에 편집

는 지금까지이 나의 지시이다 단점은 모든 입력 필드에 대해이 리스너를 코드에 수동으로 첨부해야한다는 것입니다. 따라서 기존 입력 지시문을 변경하여이 수신기를 포함하는 것이 유용합니다.

+0

당신이 말하는 청취자의 유형은 무엇입니까? –

+0

[확장 각도 명령] (http://stackoverflow.com/questions/17005122/extending-angular-directive) –

+0

당신의 의견에 대한 내 기존 지시어 – 23tux

답변

0

입력 지시문을 비롯한 모든 지시문을 쉽게 확장 할 수 있습니다. Here은 지시문에 클래스를 추가하는 빠른 예제입니다.

+9

확장하지 않고 별도의 지시문을 추가하고 있습니다. 효과적으로 코드 OP를 작성하는 것은 피하려고합니다. –

18

여기에 당신이 당신 자신이 제안으로 $provide.decorator으로, 각도 input 지시에 내장 된 장식 수있는 방법의 짧은 요점은 다음과 같습니다

또한,이 링크 ("확장 지침"에서) 몇 가지 기술을 설명합니다. 내가보기로이 방법의

app.config(function ($provide) { 

    // Suffix is "Directive" for decorating directives. 
    // $delegate refers to the original directive definition. 
    $provide.decorator('inputDirective', function ($delegate) { 

    // When decorating a directive, $delegate is an array containing 
    // all of the directives of the same name. 
    // We're interested in the first in this case. 
    var directive = $delegate[0]; 

    // Store a reference to the original directive linking function. 
    var link = directive.link; 

    // Hook into the compile phase of the directive. 
    directive.compile = function() { 

     // The function returned by compile is your new link function. 
     // Or 'postLink', to be exact. 
     return function (scope, el, attrs) { 

     // Run the original link function. 
     link.apply(this, arguments); 

     // Your new listener function 
     function listener (e) { 
      console.log(e); 
     } 

     // Set up your listener(s). 
     el.bind('blur', listener); 
     el.bind('focus', listener); 
     }; 
    }; 

    // Return the decorated original ($delegate). 
    return $delegate; 
    }); 

}); 

장점 :

  1. 그것은 행동을 증가시키기 위해 다른 지시문을 추가하는 것보다 더 DRY입니다.
  2. 제 3 자 동작 확장입니다.
  3. 대부분의 경우, 사용자가 꾸미고있는 지시어 (또는 해당 서비스)의 내부 구현에 대해 알 필요가 없습니다.

는 여기 jsBin입니다 : http://jsbin.com/yafecinu/2/edit

나는 그 장식 지침에 심층 간다, 당신은 this article 살펴 보도록 권하고 싶습니다. 이 기사에서는 링크 단계뿐만 아니라 컨트롤러 및 사전 DOM 조작 조작에 대해서도 다룹니다. 아주 좋은 읽을 거리!

+0

이것은 갈 길이지만 각도 1.3 이후로 사전 연결을 사용해야합니다 : 'var link = directive.link.pre; ' – Scraph

+0

각도 부트 스트랩 1.1.1과 datepickers를 사용하여 문제가 발생했습니다. 이 코드를 사용하는 사용자 정의 데코레이터. 이전의 pre-link 함수를 저장/호출하는 대신, 이전의 컴파일 함수를 사용하는 것이 더 나은 해결책이라고 생각합니다. 어쨌든 내 문제가 해결되었습니다. –

+0

@JosephHelfert 전적으로 원래 지침에서 벗어나고 자하는 정도에 달려 있습니다. 뭔가 간단한 것이라면 아마도 link/controller로 갈 수있을 것입니다. 더 세분화 된 컨트롤이 필요하다면, 오래된 컴파일 함수를 사용하는 것이 멋쟁이 일뿐입니다! –