2013-01-24 3 views
2

JCrop을 AngularJS와 함께 사용하려고합니다. 나는 조금 해결하기 위해 도움을 필요로 다음 지시문이 있습니다AngularJS JCrop 지시문을 수정하는 방법은 무엇입니까?

.directive('imgCropped', function() { 
    return { 
     restrict: 'E', 
     replace: true, 
     scope: { src:'@', selected:'&' }, 
     link: function(scope,element, attr) { 
      var myImg; 
      var clear = function() { 
       if (myImg) { 
        myImg.next().remove(); 
        myImg.remove(); 
        myImg = undefined; 
       } 
      }; 
      scope.$watch('src', function(nv) { 
       clear(); 
       if (nv) { 
        element.after('<img />'); 
        myImg = element.next(); 
        myImg.attr('src',nv); 

        $(myImg).Jcrop({ 
         trackDocument: true, 
         onSelect: function(x) { 
          /*if (!scope.$$phase) { 
           scope.$apply(function() { 
            scope.selected({cords: x}); 
           }); 
          }*/ 
          scope.selected({cords: x}); 
         }, 
         aspectRatio: 1, 
         boxWidth: 400, boxHeight: 400, 
         setSelect: [0, 0, 400, 400] 
        }); 
       } 
      }); 

      scope.$on('$destroy', clear); 
     } 
    }; 
}) 

문제가 JCrop 올바르게 실제 이미지 크기를 감지하지 않는다는 것입니다 및 나는 trueSize 옵션, 내가 알고있는 유일한 방법을 추가 할 필요가 어떻게 해야할지 콜백에서 Jcrop 호출을 감싸는 것은 꽤 심해 보인다.

또한 onSelect 콜백에서 scope. $ apply를 사용하면 이미 진행중인 $ digest 오류가 발생합니다. 그게 왜?

편집 : 성공적으로 다음 코드로 실제 이미지 크기를 얻을 수 있지만, 그렇게

.directive('imgCropped', function() { 
    return { 
     restrict: 'E', 
     replace: true, 
     scope: { src:'@', selected:'&' }, 
     link: function(scope,element, attr) { 
      var myImg; 
      var clear = function() { 
       if (myImg) { 
        myImg.next().remove(); 
        myImg.remove(); 
        myImg = undefined; 
       } 
      }; 
      scope.$watch('src', function(nv) { 
       clear(); 
       if (nv) { 
        element.after('<img />'); 
        myImg = element.next(); 
        myImg.attr('src',nv); 

        var temp = new Image(); 
        temp.src = nv; 
        temp.onload = function() { 
         var width = this.width; 
         var height = this.height; 

         $(myImg).Jcrop({ 
          trackDocument: true, 
          onSelect: function(x) { 
           /*if (!scope.$$phase) { 
           scope.$apply(function() { 
           scope.selected({cords: x}); 
           }); 
           }*/ 
           scope.selected({cords: x}); 
          }, 
          aspectRatio: 1, 
          boxWidth: 400, boxHeight: 400, 
          setSelect: [0, 0, 400, 400], 
          trueSize: [width, height] 
         }); 
        } 
       } 
      }); 

      scope.$on('$destroy', clear); 
     } 
    }; 
}) 
+0

작동하지 않는 부분에 대해 놀랍지 않습니까? 실제로 JCrop을 Angular와 함께 사용하고 있습니다.하지만 이렇게하지는 마십시오. img src는 변경되지 않으므로 img 태그에 속성 지시문을 사용하고 있습니다. –

+0

저는 plunkr (http://plnkr.co/edit/phXrGBxpPY7DZjkQmGXd)을 완벽하게 작성했습니다. (의도적으로 엄청난 이미지를 넣었습니다.) 내 응용 프로그램에서 작동하지 않으며 잘못된 이미지 크기가 감지됩니다. 일부 CSS 규칙이 이미지의 스타일을 지정하고 이것이 원인 일 수 있습니까? –

+0

CSS 규칙은 이미지를로드하는 이미지 개체의 방식에 영향을 주어서는 안됩니다. –

답변

1

당신이하고있는 것은 아마 괜찮 할 수있는 더 좋은 방법이 있어야합니다. 지침은 괜찮아 보입니다. 이미지 크기를 가져다 주자면 다음과 같이 똑같은 JavaScript로 처리 할 수 ​​있습니다.

var img = new Image(); 
img.onload = function() { 
    var w = img.width, 
     h = img.height; 
    //do what you need to do here. 
}; 
img.src = 'somefile.gif'; 

DOM 조작을 줄일 수 있습니다. 내가 (약간 더 수정 후) 이물을 누르면됩니다 지시문에서 일하고 있어요

+0

주셔서 감사합니다 이것은 내가 편집 부분에 질문을 추가했습니다. JCrop 문을 콜백에 넣으려면 꽤 못 생겼다. –

+1

Heh ... 자바 스크립트에 오신 것을 환영합니다. 콜백 함수를 중첩 된 익명 함수가 아닌 자체 선언으로 파생시킬 수 있습니다. 내가 당신을 위해 가지고있는 한 가지 팁이 있습니다 : 당신은 지시어의 scope.src에 대한 감시권을 가지고 있지만 그것을 절대 업데이트하지 않으며, 당신은 그것을 양방향 바인딩 "@"대신에 단방향 바인딩 "@"으로 채우고 있습니다. = ". 알고 있어야 할 것. –

+0

"src"는 실제 응용 프로그램에서 동적입니다. –

관련 문제