2013-06-30 7 views
3

왜 $ scope.orderBy가 정의되지 않습니까? "테스트"중이십니까?각도 js 범위 속성이 정의되지 않았습니다.

http://jsfiddle.net/XB4QA/4/

var app = angular.module("Foo", []); 

app.directive("two", function() { 
return { 
    scope: { 
     orderBy: '@' 
    }, 
    restrict: 'E', 
    transclude: true, 
    controller: function ($scope, $element, $attrs) { 
     console.log($scope.orderBy); // is undefined, why? 
    }, 
    template: '<div></div>', 
    replace: true 
}; 
}); 

<div ng-app="Foo"> 
    <two order-by="test">test</two> 
</div> 

답변

1

@ 바인딩 지침의 범위에서 보간이 보간은 지향성 링크 단계 후에, 나중에 일어난다. 즉, 지시문 템플릿은 바인딩을 사용할 수 있지만 다양한 지시문 구성 메소드에서는 사용할 수 없습니다. 그러나 = 바인딩은 지시문에서 즉시 사용할 수 있으므로 즉시 액세스하려는 경우 이러한 바인딩을 사용하는 것이 좋습니다.

test는 같은 속성 값 주위에 작은 따옴표를 추가로 액세스하려는 리터럴 값 인 경우 :

<two order-by="'test'"> 

또는 test 변수 인 경우 그대로 단지 HTML을두고는. 두 경우 모두, 같은 바인딩을 변경하면 (@의 사용에 의한 경우 것 같다) 문자열 보간을 사용하고자하는 경우에 대한 의견 아제에 의해 언급 한 바와 같이

scope: { 
    orderBy: '=' // = instead of @ 
} 
+0

음,하지만 사용하는 '='는 양방향, 내가 로컬 범위에서만 사용 할 수 있습니다 :

app.directive("two", function() { return { scope: { orderBy: '@' }, restrict: 'E', transclude: true, controller: function ($scope, $element, $attrs) { $attrs.$observe('orderBy', function() { console.log($scope.orderBy); }); }, template: '<div></div>', replace: true }; }); 

그래서이 작업을 수행합니다. – user2071301

+0

"왜"당신의 질문에 대답하고있었습니다. 원본을 수정하지 않으려면 값을 새 변수에 복사 할 수 있습니다. 우리가'test'를 변수로 사용한다는 것을 알 수 없기 때문에, 그 값은'test'라고 기대했기 때문에 질문은 다소 혼란 스럽습니다. – sh0ber

+0

"test"는 기존 변수에 대한 참조가 아닌 리터럴이어야하므로 답변 (''test '')이 적합합니다. 도와 줘서 고마워. – user2071301

0

당신은 $observe를 이용해야한다 현재 허용되는 답변입니다.

또는 orderBy 특성이 항상 리터럴 문자열 인 경우 빈 격리 범위를 만들고 orderBy을 바인딩하지 않을 수 있습니다. 그런 다음 $attrs.orderBy을 사용하여 문자열 값을 가져올 수 있습니다.

잘 작동합니다. 작동

app.directive("two", function() { 
    return { 
    scope: { 
    }, 
    restrict: 'E', 
    transclude: true, 
    controller: function ($scope, $element, $attrs) { 
     console.log($attrs.orderBy); 
    }, 
    template: '<div></div>', 
    replace: true 
    }; 
}); 
+0

그의 주요 질문은 바로 그 값을 사용할 수없는 이유입니다. 그것이 즉시 사용된다면,'@'는'$ observe '를 사용해도 나중에 좋은 해결책이 될 수 없습니다. 게다가 보간 된 값이 없기 때문에'@'바인딩을 사용할 이유가 없다. 또한'$ attrs.orderBy'는 주석에 이미 언급되었습니다. – sh0ber

+0

나는 현재 받아 들여진 대답은 유효하지만 실제로 원래의 질문에 대답하지 않는다고 생각한다. 물론, 양방향 데이터 바인딩으로 전환 할 수는 있지만'@'가 작동하지 않는 이유는 설명하지 않습니다. OP가 항상 리터럴을 사용하고 싶다면 바인딩을 사용할 이유가 없습니다 (내 대답과 자신의 의견 모두에 명시된 바와 같이). – rtcherry

+0

부적절한 경우에도 '@'바인딩을 사용하는 방법보다는 값이 정의되지 않은 이유에 대한 질문이있는 것 같습니다. 나는 이것이 위의 질문에 대한 답이나 토론에 추가하지 않는다고 생각하지만 걱정은하지 않는다. – sh0ber

관련 문제