2015-05-15 3 views
0

Я могу видеть свои данные в console.log. Я просто не понимаю, почему я не могу получить к ней доступ с помощью $scope.$parent.locations. Что мне не хватает?Передача переменной области действия в директиву

coupons.html

<div id="coupons-grid" coupons-repeater="locations"> 
</div> 

<!-- <p> When uncommented, below I can see all my location data <p> 
<p> {{ locations }} </p> --> 

директива

.directive("couponsRepeater", function() { 
    return { 
    compile: function(elem, attr) { 
     return function($scope, $element, $attr) { 
     console.log($scope.$parent); // in the console I see "locations" which is the data I need 
     console.log($scope.$parent[$attr.couponsRepeater]); // comes back undefined - this is the call I would like to use because it's dynamic 
     console.log($scope.$parent.locations); // comes back undefined 
     } 
    } 
    } 
}) 

CouponsCtrl

.controller('CouponsCtrl', function ($scope, $state, $http, $ionicLoading, userService) { 
    $scope.locations = {one:1, two:2, three:3}; 
}) 
+1

Я немного смущен. Вы пытаетесь получить доступ к '$ scope. $ Parent', но директива не создает область - это было ваше намерение? Кроме того, вы можете показать, как директива и контроллер перехватывают? Он отлично работает для меня (я должен был добавить 'ng-if =" true "' для создания области): http: //plnkr.co/edit/WKGegNI79f2EMTDnRYK9? P = preview –

+0

@NewDev +1, и я получил его работайте без 'ng-if' – Jacksonkr

+0

да, вам не нужно' ng-if' - я просто использовал его, потому что я не был уверен, что ваше использование '$ scope. $ parent' было непреднамеренным или что-то еще было что вы не отправляли сообщения, поэтому я «исправил» его с помощью «ng-if» –

ответ

1

Это потому $attr.couponsRepeater не определено, где attr.couponsRepeater имеет значение, которое вы ищете.

На стороне примечание, используя $parent для доступа к данным, это не очень хорошая идея, ваша директива должна использовать изолированную область, а родитель должен передавать данные через другие атрибуты. Example JSFiddle here.

app.directive("couponsRepeater", function() { 
    return { 
     restrict: 'A', 
     scope: { 
      locations: '=couponsRepeater' 
     }, 
     link:function (scope, ele, attrs) { 
      console.log(scope.locations); 
     } 
    } 
}); 

С HTML.

<div coupons-repeater="locations"> 
</div> 
+0

NB использование '@' в области будет передавать строковые «местоположения», используя '=' будет получать фактические местоположения ('{one: 1, two: 2, three: 3}', в вопросе). Кроме того, директива не должна ограничиваться тегом «E» (элемент), он может сохранять свою разметку, ограничивая тег «A» (атрибут) и используя «scope: {myVal: '= couponsRepeater'} ' – DRobinson

+0

Обновлено на основе' location' как редактирование объекта для вопроса. –

+0

@DRobinson Ограничение на 'E' заключается в том, чтобы способствовать четкому различию между директивой и атрибутами области видимости, которые связываются. Полагаю, что «EA» или просто «A» сильно затрудняет расшифровку HTML, по моему мнению. Не видел преимуществ, указывающих на все варианты DDO. Спасибо, что выбрали места с ошибками. –

Смежные вопросы