2014-03-24 1 views
1

두 개의 지시문이 있으며 첫 번째 지시문에서 $ http 쿼리를 사용하여 두 번째 지시문에서 ng-repeat를 채 웁니다. 이 데이터를 다른 사람에게 어떻게 전달할 수 있습니까?AngularJS에서 하나의 지시문에서 다른 지시문으로 데이터 전달

var app = angular.module('myApp'); 


app.directive('release', ['musicInfoService', 
    function(musicInfoService) { 

    return { 
     restrict: 'E', 
     scope: { 
     release: '=', 
     artist: '=' 
     }, 
     template: '<div class="release">' + 
     '<div class="wrapper"><img class="img-responsive" ng-src="{{imageSrc}}"/><div id="text" ng-click="getVersions(release)"></div></div>{{release.title | characters:65}}' + 
     '</div>', 
     replace: false, 
     link: function(scope, elem, attr) { 
     var defaultImage = 'img/record-default.png'; 
     scope.imageSrc = defaultImage; 
     musicInfoService.getAlbumInfo(scope.artist.name, scope.release.title) 
      .success(function(data) { 
      if (data.error) return; 

      var image = data.album.image[2], 
       imageUrl = defaultImage; 

      if (image['#text'] !== '') { 
       imageUrl = image['#text']; 
      } 

      scope.imageSrc = imageUrl; 
      }); 

     scope.getVersions = function(release) { 

      if (angular.isUndefined(release)) return; 

      musicInfoService.getReleaseVersions(release.id) 
      .success(function(data) { 
       release.versions = data.versions; 
      }); 
     }; 
     } 
    }; 
    } 
]); 

app.directive('theDirective', ['musicInfoService', 
    function(musicInfoService) { 
    return { 
    restrict: 'A', 
    scope: { position: '@', last: '@', release: '=', 
     artist: '=' }, 
    link: function(scope, element, attrs) { 

     element.bind('click', function() { 

     // Highlight clicked element 
     angular.element(document.querySelector('.clicked')).removeClass('clicked'); 
     element.addClass('clicked'); 

     // Create the collapse element or select existing one 
     var collapseQuery = document.querySelector('#collapse'); 
     var collapse = collapseQuery === null ? 
      angular.element('<div id="collapse" class="col-xs-12"><ul><li>{{release.title}}</li><li ng-repeat="version in release.versions | filter:\'!mp3\' | filter:\'!wav\' ">{{version.format}}</li></ul></div>') : 
      angular.element(collapseQuery); 

     // Based on the position of the clicked element calculate the rounded number up to the nearest multiple of four 
     var calculatedPosition = Math.ceil(scope.position/4) * 4; 

     // Get the element at the calculated position or the last one 
     var calculatedQuery = document.querySelector('[position="' + calculatedPosition + '"]'); 
     if (calculatedQuery === null) calculatedQuery = document.querySelector('[last="true"]');; 

     var calculatedElement = angular.element(calculatedQuery); 

     // Insert the collapse element after the element at the calculated position 
     calculatedElement.after(collapse); 

     // Highlight the calculated element 
     angular.element(document.querySelector('.calculated')).removeClass('calculated'); 
     calculatedElement.addClass('calculated'); 
     }); 

     scope.$on('$destroy', function() { 
     element.unbind('click'); 
     }); 
    } 
    }; 
} 
]); 

첫 번째 지침이 호출한다 : 여기

코드의

 scope.getVersions = function(release) { 

      if (angular.isUndefined(release)) return; 

      musicInfoService.getReleaseVersions(release.id) 
      .success(function(data) { 
       release.versions = data.versions; 
      }); 
     }; 

을 그리고 두 번째 지시에서, 여기에 결과를 사용해야합니다

var collapseQuery = document.querySelector('#collapse'); 
    var collapse = collapseQuery === null ? 
     angular.element('<div id="collapse" class="col-xs-12"><ul><li>{{release.title}}</li><li ng-repeat="version in release.versions | filter:\'!mp3\' | filter:\'!wav\' ">{{version.format}}</li></ul></div>') : 
     angular.element(collapseQuery); 

이견있는 사람?

수정 : 문제를 설명하기 위해 Plunker을 만들었습니다.

+0

당신은 부모 범위에'release'을 넣어 두 지시어에 바인딩하거나 서비스에 데이터를 저장하고 두 지시어에 주입 할 수있다. – Nick

답변

1

나는 가 공유 데이터를 보유하고 서비스를 만들 수 공장를 사용하는 것이 좋습니다. 이 서비스는 종속성으로 두 지시문 모두에 주입됩니다.

app.factory("sharedDataService", function() { 
      return { 
       yourData: "whatever" 
      }; 
     }); 

이 참조 :

희망이 도움이

UPDATE

I created a plunker to illustrate what I mean

+0

나는 Plunker를 만들었습니다 (EDIT 참조). 공장을 어디에서 만들어야합니까? 나는 거기에 여러 서비스 (또 다른 서비스로부터 종속되어 있기 때문에)가 혼란스러워서 그것을 적응시키는 방법을 모른다. 여기에 오기 위해 많은 도움을 받았고, 지금 완전히 이해할 수없는 코드 조각이 있습니다 ... –

+0

Plunkr http://plnkr.co/edit/LUNCjOSWSaVf0F6uT6Dd?p=preview를 추가하고 내 답변을 업데이트했습니다. – PeterFromCologne

+0

Peter, 구현했지만 "TypeError : 속성 'undefined"공유 오류를 설정할 수 없습니다. "오류가 발생합니다. 코드는 [this plunker] (http://plnkr.co/edit/GBdvtN6ayo59017rLKPs?p=preview)의 directives.js에 있습니다. 보세요. 모르겠어. –