2013-03-12 2 views
4

ng-model을 사용하여 해당 값을 노출시키는 지침이 있습니다.지시어 범위를 분리하지만 ngModel에서 바인딩 보존

이 지시문에는 범위가 엉망인 내부 구성 요소가 있으므로 해당 범위를 격리해야하지만 여전히 외부 세계에 바인딩하는 것이 좋습니다.

어떻게하면 좋을까요?

는 지침입니다 : 당신이 볼 수 있듯이

angular.module('app', []).directive('myDirective', function() { 
    return { 
    restrict: 'E', 
    require: 'ngModel', 
    link: function(scope, element, attr, ngModel) { 
     // do stuff using ngModel controller 
    }, 
    replace: true, 
    template: '<div><input ng-model="userInput" /></div>' 
    }; 
}); 
<my-directive ng-model="prop"></my-directive> 

, 지시어의 값으로 prop을 노출해야하지만, <input ng-model="userInput"/>에 정의 된 부모 범위에 userInput을 노출해서는 안된다.

prop 만 부모 범위에서 사용할 수 있습니까?

+0

지시어 안에 무엇을하고 싶습니까? 필드 요소의 일부가 될 것입니까? 또한, 당신이 보여주는'ngModel'은'prop' 또는'userInput'을위한 것입니까? –

+0

두 개의'ng-model'이 필요합니다. 입력 된 것이 사용자 입력입니다. 내 지시어 컨트롤러는'ngModelController. $ setViewValue()'를 사용하여'prop'를 보완하고 업데이트하는 데있어'$ ​​watch'를 할 것입니다. 나는 이벤트를 입력하고 내부 'ng 모델'을 피할 수 있지만 미래에는 같은 내부 범위 속성을 공유하는 요소가 더 많아 질 것입니다. 그래서 내부 요소를 사용할 수있는 격리 된 범위를 갖고 싶지만 부모 범위에 바인딩 된'ng-model = "prop"를 여전히 갖고 싶습니다. 나는 또한 외부'ng-model '의 유효성 기능을 사용할 것이다. –

답변

3

일반적으로 ngModelController는 새 범위를 만들지 않는 지시문과 함께 사용하기위한 것입니다. 그것이 분리 범위에서 작동하도록 얻을 내가 찾은 유일한 방법은 분리 범위에 같은 이름을 사용하는 것입니다, 볼이에 대한 자세한 설명은

scope: { prop: '=ngModel' } // must use 'prop' here! 

내 SO 답변 : https://stackoverflow.com/a/14792601/215945

scope: true을 사용하여 지시문에서 새 범위를 만들도록 할 수도 있습니다. 이 경우 prop은 프리미티브가 아닌 객체 속성이어야합니다 (예 : ng-model='someObj.prop'). 이 접근법에 대해 더 알고 싶다면 https://stackoverflow.com/a/13060961/215945

을 입력하십시오. 이렇게하면 부모 범위에 영향을주지 않고 새 지시어 하위 범위에 고유 한 (새) 속성을 만들 수 있습니다. 음, 프로토 타입 상속이 다소 작동하는 방법을 알고 있어야합니다. 부모 범위에 정의 된 객체는 지시어 하위 범위에서 표시되고 변경 가능합니다. 부모 범위에 정의 된이 표시 될 수 있지만 부모 기본 값을 변경하려고하면 같은 이름의 부모 속성을 숨기거나 그만 두는 자식 속성을 만들게됩니다. 프로토 타입 상속에 대한 더 많은 정보는 here입니다.

+0

당신이 제안하는 양방향 바인딩 속임수에 대해 알고 있지만 항상 같은 속성을 사용하도록 사용자를 강요 할 수는 없습니다. 내가 시도한 또 다른 접근법은 외부 요소에서'ng-model '을 제거하고 템플릿에서 정의하는 것이다. '->'scope : {internalBind :'= 일부 '}'->'템플릿 :

...
'. 사용자가 명시 적으로'ng-model '을 사용하도록하고 싶기 때문에, 예를 들어,이 요소를'form'에서 컨트롤로 집계 할 수 있다는 것을 알고 있습니다. –

+0

@CaioToOn, 단지 궁금해서 "scope : true"대안을 좋아하지 않았습니까? (그게 내가 여기서 사용할 것입니다.) 그것은 객체 속성이 사용되는 한 (Angular 팀에서 권장하는 것, 즉 ng-model에 대한 프리미티브를 사용하지 않는 것이 좋습니다) 원하는만큼 제공해야합니다. [Misko] (http://youtu.be/ZhfUv0spHCY? t = 30m). –

+0

고마워요. 유효하지 않은 값이있을 때 값을 'undefined'로 설정하면 내 디자인이 더 좋아질 것입니다. 나는 어쨌든 스코프를 격리시키는 아이디어를 좋아했다. 나는 안티 패턴, 또는 적어도 anti-natural, 또는 이것이 공통적 인 필요성이 있다면 원하는 것을 궁금해하기 시작했다. 속성을 정의 할 필요없이 속성 이름으로 부모와 연결되어있는 속성을 선택할 수 있어야한다. 속성 이름. –

관련 문제