2013-06-13 4 views
4

컨트롤러를 사용하여 이미지 src에 액세스하려고하는데이를 저장하는 방법을 알 수 없습니다.Angularjs. AngularJS 컨트롤러에서 속성에 액세스하기

내 템플릿 :

<img data-ng-model="book.image" 
     style="width: 300px; height: 200px;" 
     ng-src="data:image/png;base64,iVBORw0K...SuQmCC"> 
    <a data-ng-click="save(book)" class="btn">Submit</a> 

내 컨트롤러 :

<a data-ng-click="save(book, $event)" class="btn">Submit</a> 

다음 컨트롤러 기능에 $event을 통과 ... 아마이 할 수있는 더 좋은 방법이있다

controller('BookEditController', [ '$scope', '$meteor', function ($scope, $meteor) { 
     $scope.save = function (book) { 
      if (typeof book == 'object') { 
       var books = $meteor("books"); 
       var id = books.insert(book); 
      } 
     }; 
    }]) 
+0

이러한 이미지가 여러 개 있습니다. – mitch

+0

하나의 base64 인코딩 이미지 만. – Serg

+0

'ng-src'는 어떻게 정적 데이터입니까, 아니면'ng-repeat' 또는? –

답변

5

하나의 옵션은 SRC를 처리 할 것입니다 그것을 저장라는 메소드를 directive을 사용하고 적용하다 속성이 이미지 태그에서 발견되었습니다.
JS

var app = angular.module('myApp', []); 
app.directive('saveImage', function() { 
    return { 
     transclude: true, 
     link: function (s, e, a, c) { 
      s.save=function(){ 
       alert(a.src); 
      }; 
     } 
    }; 
}); 

HTML

<div > 
    <img save-image style="width: 300px; height: 200px;" src="http://placehold.it/350x150"> <a ng-click="save()" class="btn">Submit</a> 

</div> 

This is the code implemented in jsfiddle.

또 다른 방법은 컨트롤러에 범위를 분리하지만 여전히 함수 대신에 이미지를 적용하는 것이다.

JS

var app = angular.module('myApp', []); 
app.directive('saveImage', function() { 
    return { 
     transclude: true, 
     link: function (s, e, a, c) { 
      s.image = a.src; 

     } 
    }; 
}); 

function cntl($scope) { 
    $scope.save = function (img) { 
     alert($scope.image || 'no image'); 
    } 
} 

HTML

<div ng-controller='cntl'> 
    <img save-image style="width: 300px; height: 200px;" src="http://placehold.it/350x150"> <a ng-click="save()" class="btn">Submit</a> 

</div> 

공지 첨가 NG 제어기 = "CNTL".

This is the JSfiddle for that one.

+0

스크립트에서 DOM을 직접 사용하는 습관이 있으므로 지금은 재교육하기가 쉽지 않습니다. 매우 상세한 답변을 해주셔서 감사합니다. 나는 당신의 옵션 중 하나를 구현하려고합니다. – Serg

+0

@Serg 문제 없습니다! 두 번째 예제는 $ scope.image가 존재하는지 확인하기 전에 $ scope.image가 있는지 확인합니다. – mitch

+1

약간의 예제 변형, 그 src 속성 book 개체의 일부가됩니다 : http://jsfiddle.net/6mkUV/ – Serg

1

탐색 방법을 사용하여 img 태그와 해당를 찾으십시오.ATTR :

$scope.save = function (book, ev) { 
    console.log(angular.element(ev.srcElement).parent().find('img')[0].src); 
    ... 

업데이트 : 더 나은 방법은 (같은 @mitch했던) 지시문을 만드는 것입니다,하지만 난 부모에 src 속성을 업데이트하기 위해 분리 범위에 바인딩 =을 사용 범위. 합니다 (=는 지시어는 범위를 변경할 수 있습니다 분명히 있다고한다. 나는이 지시문은 방법 또는 "뒤에서"컨트롤러의 범위에 속성을 추가하는 것보다 더 나은 생각합니다.)

<div ng-controller="MyCtrl"> 
    <img save-image book="book1" src="http://placehold.it/350x150" > 
    <a href="" ng-click="save(book1)">Submit</a> 
</div> 

function MyCtrl($scope) { 
    $scope.book1 = {title: "book1" }; // src will be added by directive 
    $scope.save = function(book) { 
     alert(book.title + ' ' + book.src); 
    } 
} 
app.directive('saveImage', function() { 
    return { 
     scope: { book: '=' }, 
     link: function (s, e, a, c) { 
      s.book.src = a.src; 
     } 
    }; 
}); 

Plunker

+3

내가 언급하고자하는 유일한 것은 모든 DOM 조작을 컨트롤러는 좋은 연습으로 간주되지 않습니다. http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller에서 "컨트롤러를 올바르게 사용하기"섹션을보십시오. – mitch

+0

Mark Rajcok, 나는 우아하고 간단한 해결책을 찾고 싶었습니다. 그러나 당신의 솔루션이 효과적입니다. Mitch, 숨겨진 입력 값에 src 속성을 미러링하는 해결책이있을 수 있습니다 (지시문 또는 이와 유사한 내용 포함)? 아니면 올바른 결정이 아니겠습니까? – Serg

+0

감사합니다. @ 미치, 나는 게으르다. 컨트롤러의 DOM 구조를 검사하는 것조차도 눈살을 찌푸리게된다고 언급해야합니다. 나는 당신의 대답 (+1)을 좋아하지만, 업데이트 된 답변에서 볼 수 있듯이'='로 분리 된 스코프를 사용할 것입니다. –

관련 문제