여러 속성을 Angular.js 속성 지시문에 어떻게 전달합니까?


116

다음과 같이 제한된 속성 지시문이 있습니다.

 restrict: "A"

두 가지 속성을 전달해야합니다. 숫자와 함수 / 콜백, attrs객체를 사용하여 지시문 내에서 액세스합니다 .

지시문이 요소 지시문이면 다음과 "E"같이 제한됩니다 .

<example-directive example-number="99" example-function="exampleCallback()">

그러나 이유 때문에 속성 지시문이 될 지시문이 필요합니다.

여러 속성을 속성 지시문에 어떻게 전달합니까?


이는 지시문이 생성하는 범위 유형에 따라 다릅니다 (있는 경우). 선택 사항은 새 범위 없음 (기본값 또는 명시 적 scope: false), 새 범위 (일반 프로토 타입 상속 사용, 즉, scope: true) 및 격리 범위 (예 :) scope: { ... }입니다. 디렉티브는 어떤 유형의 범위를 생성합니까?
Mark Rajcok 2013 년

1
@MarkRajcok 격리 범위가 있습니다.
Undistraction 2013 년

답변:


202

지시문 자체가 요소가 아닌 경우에도 지시문은 동일한 요소에 정의 된 모든 속성에 액세스 할 수 있습니다.

주형:

<div example-directive example-number="99" example-function="exampleCallback()"></div>

지령:

app.directive('exampleDirective ', function () {
    return {
        restrict: 'A',   // 'A' is the default, so you could remove this line
        scope: {
            callback : '&exampleFunction',
        },
        link: function (scope, element, attrs) {
            var num = scope.$eval(attrs.exampleNumber);
            console.log('number=',num);
            scope.callback();  // calls exampleCallback()
        }
    };
});

fiddle

속성 값이 example-number하드 코딩 $eval되면 한 번 사용 하고 값을 저장하는 것이 좋습니다 . 변수 num는 올바른 유형 (숫자)을 갖습니다.


스네이크 케이스를 사용하도록 예제 HTML을 편집했습니다. 나는 그것을 요소로 사용할 수 없다는 것을 알고 있습니다. 그것이 질문의 요점입니다.
Undistraction 2013 년

@Pedr, 예, 요소 사용에 대해 너무 빨리 읽었습니다. 나는 당신이 속성에도 snake-case를 사용해야한다는 점을 지적하면서 대답을 업데이트했습니다.
Mark Rajcok

문제 없어요. 답변 해 주셔서 감사합니다. 스네이크 케이스를 사용하도록 속성 이름을 편집했습니다. 내가 그저 어리석은 오류 였고 실제 질문과 답변의 요점에서 산만 해지기 때문에 답변에서 제거해도 괜찮습니까?
Undistraction 2013 년

나는 이것을 이해하지 못한다.-지시어가 그 범위에서 지시어 사용법 ( "exampleCallback ()")에 지정된 것과 똑같은 이름을 지정하는 것을 어떻게 알 수 있습니까? ( "callback : '& exampleCallback') 범위는"callback : "& exampleFunction"이어야하지 않습니까?
블래스터 '

1
@FredrikL, 동일한 요소에 대한 여러 지시문은 stackoverflow.com/a/28735005/215945
Mark Rajcok

19

요소 지시문과 동일한 방식으로 수행합니다. 당신은 그것들을 attrs 객체에 넣을 것이고, 내 샘플에는 격리 범위를 통한 양방향 바인딩이 있지만 필수는 아닙니다. 격리 된 범위를 사용하는 경우에는 scope.$eval(attrs.sample)단순히 scope.sample을 사용하여 속성에 액세스 할 수 있지만 상황에 따라 연결시 정의되지 않을 수 있습니다.

app.directive('sample', function () {
    return {
        restrict: 'A',
        scope: {
            'sample' : '=',
            'another' : '='
        },
        link: function (scope, element, attrs) {
            console.log(attrs);
            scope.$watch('sample', function (newVal) {
                console.log('sample', newVal);
            });
            scope.$watch('another', function (newVal) {
                console.log('another', newVal);
            });
        }
    };
});

사용 :

<input type="text" ng-model="name" placeholder="Enter a name here">
<input type="text" ng-model="something" placeholder="Enter something here">
<div sample="name" another="something"></div>

9

객체를 속성으로 전달하고 다음과 같이 지시문으로 읽을 수 있습니다.

<div my-directive="{id:123,name:'teo',salary:1000,color:red}"></div>

app.directive('myDirective', function () {
    return {            
        link: function (scope, element, attrs) {
           //convert the attributes to object and get its properties
           var attributes = scope.$eval(attrs.myDirective);       
           console.log('id:'+attributes.id);
           console.log('id:'+attributes.name);
        }
    };
});

객체를 사용하여 부울 값을 보낼 수 있습니까? 시도 {{true}}했지만 여전히 문자열 값을 반환합니다 true.
Peter Boomsma

4

이것은 나를 위해 일했으며 HTML5를 더 잘 준수한다고 생각합니다. 'data-'접두사를 사용하려면 HTML을 변경해야합니다.

<div data-example-directive data-number="99"></div>

그리고 지시문 내에서 변수의 값을 읽습니다.

scope: {
        number : "=",
        ....
    },

0

다른 지시문에서 'exampleDirective'를 "요구"하고 논리가 'exampleDirective'의 컨트롤러에있는 경우 ( 'exampleCtrl'이라고 가정 해 보겠습니다) :

app.directive('exampleDirective', function () {
    return {
        restrict: 'A',
        scope: false,
        bindToController: {
            myCallback: '&exampleFunction'
        },
        controller: 'exampleCtrl',
        controllerAs: 'vm'
    };
});
app.controller('exampleCtrl', function () {
    var vm = this;
    vm.myCallback();
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.