Angularjs : 부분 또는 로컬 범위 메서드에 액세스하는 방법은 무엇입니까?

Stéphane de Luca

지시문을 통해 가로 사진 스크롤러를 처리하려고합니다. 링크에서 두 개의 화살표를 처리하여 이전 / 다음 기능을 만들기 위해 컨테이너를 측정하고 싶습니다. 이 코드는 다음과 같습니다.

app.directive("photos", function () {
    return {
        restrict: "E",
        replace: true,
        scope: {
            "photoid": "@",
            "scrollable": "@",
            "size": "@",
            "height": "@",
            "list": "=",
            "prefix":"@",
            "inline": "@",
            "extension": "@",
            "class": "@",
            "slide": "@"
        },
        template: 
        '<div style="position:relative">\n\
            <div id="photos{{photoid}}" class="scroller {{class}}" ng-class="[{{scrollable}}]" ng-style="{display:list.length==1?\'inline-block\':\'block\', width: list.length==1?\'{{size||\'171px\'}}\':\'auto\', height: \'{{height||size||\'171px\'}}\'}">\n\
                <div ng-repeat="p in list"\n\
                    ng-style="{\'background-image\': \'url({{prefix}}{{p.file}}.thumb.{{extension||\'jpg\'}})\', width: \'{{size||\'171px\'}}\', height: \'{{height||size||\'171px\'}}\'}"\n\
                    ng-click="$parent.$parent.openPopoverImageViewer(\'#photos{{photoid}}\', {{$index}})">\n\
                    <div>{{p.text||p.description}}</div>\n\
                </div>\n\
            </div>\n\
            <div class="prev" ng-if="list.length>1" nng-hide="slide<=0"             ng-click="scope.prev()"></div>\n\
            <div class="next" ng-if="list.length>1" nng-hide="slide>=list.length-1" ng-click="scope.next()"></div>\n\
        </div>',
        link: function (scope, el, attrs) {
            //scope.list = JSON.parse(attrs.list);
            //.animate({scrollLeft: x}, 200);
            scope.slide = scope.slide||0;

            console.log("scope.photos: entering for id = #photos"+scope.photoid);

            var scroller = $("#photos"+scope.photoid);
            var container = scroller.parent();

            console.log("scope.photos: scroller = "+scroller);
            console.log("scope.photos: container = "+container);

            var w = container.width ();
            var h = container.height(); if (h>768) h = 768; // do not exceed image maximum retina size
            console.log("scope.photos: container (w,h)=("+w+", "+h+")");
            scope.scroller  = scroller;
            scope.container = {width: w, height: h};
            scope.image     = {width: h};
            //scope.slides  = c.length;
            //scope.slide   = index;
            console.log("scope.photos: after sizing container is "+JSON.stringify(scope.container));

            // make it scrollable or not
            if (scope.list.length*h > w) {
                scroller.addClass("hScrollable");
                console.log("scope.photos: Scroller for "+scope.list.length+" added hScrollable class");
            }
            else {
                scroller.removeClass("hScrollable");
                console.log("scope.photos: Scroller for "+scope.list.length+" removed hScrollable class");
            }
            //console.log("scope.photos: Scroller for "+c.length+" photos (container w="+w+"px, image width="+h+") start scroll at index "+index+", scrolleft= "+x+" and got: "+$(scroller).scrollLeft());


            var sw = container.width();
                 w = scroller.height();     
            var x = scope.slide*w;                      // offset at the left border
            x -= (sw-w)/2;                          // center
            if (x<0)    x = 0;                      // make sure it's not underleft

            scroller.scrollLeft(x);
            //console.log("scope.photos: Scroller for "+c.length+" photos ("+w+"px width) start scroll at index "+index+", scrolleft= "+x+" and got: "+$(scroller).scrollLeft());
        },
        prev : function() {
            console.log("scope.photos: prev()");
            scope.scroller.scrollLeft(0);
        },  
        next : function() {
            console.log("scope.photos: next()");
            scope.scroller.scrollRight(0);
        }   
    };
});

불행히도 다음과 같이 콘솔에 표시된 것처럼 null이 표시되므로 컨테이너의 너비와 높이에 액세스 할 수없는 것 같습니다.

[Log] scope.photos: entering for id = #photosImpacReglage (kws.corn.app.js.html, line 196)
[Log] scope.photos: scroller = [object Object] (kws.corn.app.js.html, line 201)
[Log] scope.photos: container = [object Object] (kws.corn.app.js.html, line 202)
[Log] scope.photos: container (w,h)=(null, null) (kws.corn.app.js.html, line 206)
[Log] scope.photos: after sizing container is {"width":null,"height":null} (kws.corn.app.js.html, line 212)
[Log] scope.photos: Scroller for 5 removed hScrollable class (kws.corn.app.js.html, line 221)

또한 로컬 범위 prev () 및 next () 메서드를 어떻게 트리거 할 수 있습니까? 메서드의 console.log ()에도 불구하고 클릭하면 콘솔 메시지가 없습니다.


[업데이트 1] @ClintPowell 덕분에 지시문을 수정했고 replace : true를 제외하고 작동합니다. 댓글을 달면 앱이 중단됩니다. 이해가 안 돼요.

jsFiddle이 바로 거기에 있습니다. 여기에 링크 설명을 입력하세요.

클린트 파월

내 의견에서 : 귀하 nextprev방법은 로컬 범위에 없었습니다. 지시문 자체에서 정의 했으므로 액세스 할 수 없습니다. 링크 함수 내에서 scope.next = function() {...}을 설정할 수 있으며 지시문 범위 내에서 액세스 할 수 있습니다.

replace속성 을 정의 할 때 각도가 끊어지는 이유는 각도가 단일 루트 요소를 갖는 지시문이 필요하기 때문입니다. 을 정의 replace하면 지시문을 첨부 한 요소가 제거되고 지시문에 정의 된대로 템플릿으로 대체됩니다. jsfiddle 코드를 보면 템플릿에 단일 루트 요소가 아니라 3 개의 형제가 divs있습니다.

를 사용하려면 http://jsfiddle.net/6mhm0tab/5 에서 한 것처럼 replace: true템플릿의 세 요소를 모두 단일으로 래핑 하거나 간단히 속성을 제거 하고 첨부 된 요소를 루트로 사용할 수 있습니다 .divreplace

행운을 빕니다. 도움이되기를 바랍니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

로컬 범위에서 리스너를 분리하는 방법은 무엇입니까?

분류에서Dev

AngularJs의 로컬 저장소에서 키 값에 액세스하는 방법은 무엇입니까?

분류에서Dev

AngularJS에서 부분적으로로드되는 목록 및 그리드보기 토글 스위치 제어를 만드는 방법은 무엇입니까?

분류에서Dev

로컬 액세스를 위해 웹 서버를 구성하는 방법은 무엇입니까?

분류에서Dev

for 루프로 렌더링 부분의 상태에 액세스하는 방법은 무엇입니까?

분류에서Dev

angularjs의 외부에서 ng-repeat 범위에 데이터를 추가하는 방법은 무엇입니까?

분류에서Dev

ember의 자식 구성 요소 범위에서 부모 구성 요소 범위에 액세스하는 방법은 무엇입니까?

분류에서Dev

AngularJS : 여러 $ parent를 통해 탐색하지 않고 최상위 범위에 액세스하는 방법은 무엇입니까?

분류에서Dev

클래스 외부의 클래스 메서드 내에서 변수 또는 목록 또는 사전에 액세스하는 방법은 무엇입니까?

분류에서Dev

AngularJS 범위에서 입력 값을 얻는 방법은 무엇입니까?

분류에서Dev

AngularJS에서 범위를 포맷하는 방법은 무엇입니까?

분류에서Dev

angularjs에서 범위를 복제하는 방법은 무엇입니까?

분류에서Dev

페이지의 다른 부분에 대한 CSS 효과를 방지하기 위해 JavaScript로 CSS 범위를 만드는 방법은 무엇입니까?

분류에서Dev

프로젝트에서 커밋을 얻기 위해 Github 사용자의 Atom 피드에 액세스하는 방법은 무엇입니까? 또는 대안

분류에서Dev

Angularjs에서 양식 값에 액세스하는 방법은 무엇입니까?

분류에서Dev

iter의 위치 메소드에서 인덱스에 액세스하는 방법은 무엇입니까?

분류에서Dev

메서드 외부에서 'var'유형의 변수에 액세스하는 방법은 무엇입니까?

분류에서Dev

외부 JavaScript 코드를 사용하여 Bokeh 플롯 또는 위젯에 액세스하고 업데이트하는 방법은 무엇입니까?

분류에서Dev

위젯 외부에서 공급자에 액세스하는 방법은 무엇입니까?

분류에서Dev

PyQT : 외부 함수에서 MainWindow 위젯에 액세스하는 방법은 무엇입니까?

분류에서Dev

PyQT : 외부 함수에서 MainWindow 위젯에 액세스하는 방법은 무엇입니까?

분류에서Dev

실행 후 하위 메서드의 속성에 액세스하는 방법은 무엇입니까?

분류에서Dev

콜론으로 구분 된 필드를 분할하고 액세스하는 방법은 무엇입니까?

분류에서Dev

R에서 날짜 범위로 시계열 데이터를 분할하는 방법은 무엇입니까?

분류에서Dev

ReactJS에서 로컬 범위로 CSS 파일을 가져 오는 방법은 무엇입니까?

분류에서Dev

멤버 이름 (또는 경로)이 문자열에 저장된 개체의 멤버에 액세스하는 방법은 무엇입니까? (angularjs)

분류에서Dev

HTML 단락에서 범위와 텍스트를 세로로 정렬하는 방법은 무엇입니까?

분류에서Dev

범위 내에서 jQuery 또는 Regex로 가격을 선택하는 방법은 무엇입니까?

분류에서Dev

파이썬의 다른 범위에서`with`-context에 액세스하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    로컬 범위에서 리스너를 분리하는 방법은 무엇입니까?

  2. 2

    AngularJs의 로컬 저장소에서 키 값에 액세스하는 방법은 무엇입니까?

  3. 3

    AngularJS에서 부분적으로로드되는 목록 및 그리드보기 토글 스위치 제어를 만드는 방법은 무엇입니까?

  4. 4

    로컬 액세스를 위해 웹 서버를 구성하는 방법은 무엇입니까?

  5. 5

    for 루프로 렌더링 부분의 상태에 액세스하는 방법은 무엇입니까?

  6. 6

    angularjs의 외부에서 ng-repeat 범위에 데이터를 추가하는 방법은 무엇입니까?

  7. 7

    ember의 자식 구성 요소 범위에서 부모 구성 요소 범위에 액세스하는 방법은 무엇입니까?

  8. 8

    AngularJS : 여러 $ parent를 통해 탐색하지 않고 최상위 범위에 액세스하는 방법은 무엇입니까?

  9. 9

    클래스 외부의 클래스 메서드 내에서 변수 또는 목록 또는 사전에 액세스하는 방법은 무엇입니까?

  10. 10

    AngularJS 범위에서 입력 값을 얻는 방법은 무엇입니까?

  11. 11

    AngularJS에서 범위를 포맷하는 방법은 무엇입니까?

  12. 12

    angularjs에서 범위를 복제하는 방법은 무엇입니까?

  13. 13

    페이지의 다른 부분에 대한 CSS 효과를 방지하기 위해 JavaScript로 CSS 범위를 만드는 방법은 무엇입니까?

  14. 14

    프로젝트에서 커밋을 얻기 위해 Github 사용자의 Atom 피드에 액세스하는 방법은 무엇입니까? 또는 대안

  15. 15

    Angularjs에서 양식 값에 액세스하는 방법은 무엇입니까?

  16. 16

    iter의 위치 메소드에서 인덱스에 액세스하는 방법은 무엇입니까?

  17. 17

    메서드 외부에서 'var'유형의 변수에 액세스하는 방법은 무엇입니까?

  18. 18

    외부 JavaScript 코드를 사용하여 Bokeh 플롯 또는 위젯에 액세스하고 업데이트하는 방법은 무엇입니까?

  19. 19

    위젯 외부에서 공급자에 액세스하는 방법은 무엇입니까?

  20. 20

    PyQT : 외부 함수에서 MainWindow 위젯에 액세스하는 방법은 무엇입니까?

  21. 21

    PyQT : 외부 함수에서 MainWindow 위젯에 액세스하는 방법은 무엇입니까?

  22. 22

    실행 후 하위 메서드의 속성에 액세스하는 방법은 무엇입니까?

  23. 23

    콜론으로 구분 된 필드를 분할하고 액세스하는 방법은 무엇입니까?

  24. 24

    R에서 날짜 범위로 시계열 데이터를 분할하는 방법은 무엇입니까?

  25. 25

    ReactJS에서 로컬 범위로 CSS 파일을 가져 오는 방법은 무엇입니까?

  26. 26

    멤버 이름 (또는 경로)이 문자열에 저장된 개체의 멤버에 액세스하는 방법은 무엇입니까? (angularjs)

  27. 27

    HTML 단락에서 범위와 텍스트를 세로로 정렬하는 방법은 무엇입니까?

  28. 28

    범위 내에서 jQuery 또는 Regex로 가격을 선택하는 방법은 무엇입니까?

  29. 29

    파이썬의 다른 범위에서`with`-context에 액세스하는 방법은 무엇입니까?

뜨겁다태그

보관