2014-03-12 4 views
18

저는 Angular와 함께 일하고 있는데, 저는 보통 jQuery를 사용하는 것에 문제가 있습니다.각도를 사용하면 클릭 이벤트를 요소에 바인딩하고 클릭하면 형제 요소를 위아래로 슬라이드 할 수 있습니까?

클릭 이벤트를 요소에 바인딩하고 클릭시 형제 요소를 위아래로 슬라이드합니다.

<div ng-click="events.displaySibling()"></div> 

을 그리고이 무엇인지 내 컨트롤러 : 내 마크 업 기능과 NG 클릭 속성을 추가 한 각도를 사용

$('element').click(function() { 
    $(this).siblings('element').slideToggle(); 
}); 

:

은 jQuery를은 다음과 같은 형태가 될 것이다 다음과 같이 표시됩니다.

지금까지 예상대로 작동하지만 어코드하는 법을 모르겠습니다. 슬라이드를 닦으십시오. 어떤 도움이라도 대단히 감사합니다.

업데이트

나는 지시어와 교체했다.

내 태그는 이제 다음과 같습니다 : 나는 내 컨트롤러에 있던 무슨 제거하고 새로운 지침을 만든

<div class="wrapper padding myevent"></div> 

.

app.directive('myevent', function() { 
    return { 
     restrict: 'C', 
     link: function(scope, element, attrs) { 
      element.bind('click', function($event) { 
       element.parent().children('ul').slideToggle(); 
      }); 
     } 
    } 
}); 

그러나 여전히 슬라이드 토글을 사용할 수 없습니다. slideToggle()이 Angular에서 지원됩니다. 어떤 제안?

+2

는 일반적으로 당신이 컨트롤러에 반대로 지시에 DOM 조작을 넣고 싶다. – ken4z

+0

위에서 언급 한대로 지시문은 모든 DOM 조작에 적합한 선택입니다. 컨트롤러에서 DOM에 액세스하는 경우 컨트롤러를 뷰에 연결하면 뷰를 변경할 수없고 컨트롤러가 여전히 작동하는지 확인할 수 있습니다. 몇 가지 다른 이유가 있지만 DOM 조작은 지시문에 따라야합니다. 사용자 지정 지시문을 작성하는 방법을 살펴 보겠습니다.이 예제는 매우 명확해야합니다. 아래에 간단한 예제를 제공합니다. – shaunhusain

+0

Angular 이전에 jQuery를 포함 시키면 slideToggle이 jqLite에 포함되지 않는 것이 맞다고 생각합니다. 사용하기 전에 jQuery를 사용할 수 있습니다. 때로는 이것을 피하는 것이 가장 좋기 때문에 오래된 방식에 익숙하지 않고보다 우아하고 검증 가능한 솔루션을 놓치지 말고 다른 경우에는 jQuery를 포함하는 것이 좋습니다. – shaunhusain

답변

12

나는 당신이 말하는 행동에 대해 정확히 모르겠다. 그러나 나는 당신이 약간 다른 방식으로 생각하도록 권장 할 것이다. 덜 jQuery, 더 각도. - yearofmoo 어떻게 $animate 작품의 훌륭한 개요를 가지고

<div ng-click="visible = !visible"></div> 
<div ng-show="visible">I am the sibling!</div> 

그런 다음 형제 슬라이드를 만들기 위해 ng-animate에서 빌드를 사용할 수 있습니다

,이처럼 html로 뭔가가있다.

이 예에서는 HTML에 표시 로직을 넣을 수있을만큼 간단하지만 그렇지 않으면 다음과 같이 컨트롤러에 넣어 원칙적으로하는 것이 좋습니다 것입니다 :

<div ng-click="toggleSibling()"></div> 
<div ng-show="visible"></div> 

컨트롤러 :

이러한 종류의 구성 요소는 지시어의 가장 중요한 후보이기도합니다.이 구성 요소는 모든 것을 깔끔하게 정리합니다.

+0

나는이 질문에 답하려고했으나 @Ed는 좋은 대답을 가지고있다. 나는 아직 ngAnimate를 시도하지 않았기 때문에 ngAnimate가 도입되기 전에 내가했을 것입니다. 애니메이션을 추가하려면'ng-class = { 'open': visible}'을 사용하고'.open'을 설정하여 다른 상태를 표시하고 CSS 전환을 사용하여 애니메이션을 만들 수 있습니다. –

+0

좋아, 그래서 내 자신의 사용자 지정 지시문을 사용하지 않고 내장 ngClick 및 ngShow 지시문을 사용하여 애니메이션없이 형제를 표시하거나 숨길 수 있습니다. ng-show = "visible"인 형제는 "visible"이 true로 설정된 경우에만 표시되지만 ng-click = "visible =! visible"의 표현식을 설명 할 수 있는지 이해합니까? 여기서 무슨 일이 일어나고있는거야? ng-animate를 살펴 보겠습니다. 당신의 도움을 주셔서 감사합니다! –

+0

'visible =! visible'은 단순히 visible 값을 반전합니다. '! '를'not'로 읽습니다. 즉'visible'이'true'이면'! visible'은'false'입니다.그래서 기본적으로 상단 div를 클릭하면 'true'와 'false'사이에 '표시'가 토글됩니다. –

5
app.directive('slideMySibling', [function(){ 
    // Runs during compile 
    return { 
    // name: '', 
    // priority: 1, 
    // terminal: true, 
    // scope: {}, // {} = isolate, true = child, false/undefined = no change 
    // controller: function($scope, $element, $attrs, $transclude) {}, 
    // require: 'ngModel', // Array = multiple requires, ? = optional,^= check parent elements 
    restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment 
    // template: '', 
    // templateUrl: '', 
    // replace: true, 
    // transclude: true, 
    // compile: function(tElement, tAttrs, function transclude(function(scope, cloneLinkingFn){ return function linking(scope, elm, attrs){}})), 
    link: function($scope, iElm, iAttrs, controller) { 
     iElm.bind("click", function(){ 
     $(this).siblings('element').slideToggle(); 
     }) 
    } 
    }; 
}]); 

사용이 될 뭔가

<div slide-my-sibling><button>Some thing</button></div><div>Some sibling</div> 

같은 주 모든 "코드"위의 단지 예를 위해서이며, 실제로 테스트되지 않았습니다.

http://plnkr.co/edit/qd2CCXR3mjWavfZ1RHgA

여기에 샘플입니다 Plnkr 등은 여전히 ​​이상적으로 당신은 몇 가지 지침이 작업을 수행 할 뷰의 구조에 대한 가정을 만드는 자바 스크립트가 있기 때문에이 이상적인 설치되지 않습니다 코멘트에서 언급했지만 여기서 하나는 다른 것을 필요로하거나 이벤트를 사용한다 ($ emit, $ broadcast, $ on 참조).

또한 지시문을 통해 JavaScript를 통해 "프로그래밍 방식으로"자식을 만들 수 있으며 지시문이 어떤 문맥에서 사용되는지 알지 못하는 문제를 피할 수 있습니다. 문제는 없지만 이러한 문제를 해결할 수있는 많은 방법이 있습니다 당신의 코드에서 https://docs.angularjs.org/api/ng/function/angular.element

AngularJS와 요소가 관련에 대한 JQuery와 DOM 객체를 나타냅니다 기능이 링크 당으로 등, 그들은 재사용 성, 안정성 테스트를 위해 주목할 가치가있다

+0

이것은 템플릿을 포함하지 않았기 때문에 OP의 예제보다 뷰에서 더 이상 분리되어 있지 않습니다. 예를 들어 형제가없는 요소를 사용 예제에서 보여 주었다면 클릭하면 오류가 발생합니다. 지시문을 사용하는 것에 동의하지만이 상용구 코드에는 이유가 표시되지 않습니다. –

+0

당신 말이 맞아요.이 예제는 단순한 것이 아닙니다. 지시어의 구조가 무엇인지 보여주는 것입니다. (SublimeText의 스 니펫을 사용했습니다.) 이것은 대답에 대한 답이 될만한 것은 아닙니다. 당신이 원한다면 그것을 제거하십시오. 그러나 보는 것이 유용 할 것이라고 생각했습니다. 형제에게 접근하는 문제에 관해서는 당신의 권리가 있지만, 기본적으로 이것은 서로를 필요로하는 추가 지시어를 사용하거나 요소간에 통신하기 위해 emit/broadcast/on을 사용하여 몇 가지 방법으로 처리 할 수 ​​있다고 생각합니다. 몇 가지 옵션이 있습니다. – shaunhusain

+0

사실, 답변을 제거 할 필요가 없으므로 최소한의 가능성을 지닌 코드 템플릿을 넣어서 더 완벽하게 만들 것을 제안합니다. –

0

작업을 중지합니다 요소. JQuery 함수를 사용하려면 각도 하중을 받기 전에 JQuery 라이브러리를 사용해야한다. 자세한 내용은 위의 링크를 참조하십시오.

-2

모범 사례 :

<div ng-if="view"></div> 

$scope.view = true; 

$scope.toggle = function(){ 
    $scope.view = ($scope.view) ? false : true; 
} 
+0

FYI : 맨 위로 대답은 이것을 $ scope.visible =! $ scope.visible;로 설명합니다. 이 답변은 최상위 답변에서 개선되지 않습니다. 이전 질문에 대한 새로운 대답이 이전 답변보다 더 많은 가치를 부여하는지 확인하십시오. –

+0

그래, 가장 좋은 방법은 좋지만 토글하는 가장 좋은 방법은 아니다 !! –