2015-08-31 3 views
0

Это мой код прямо сейчас:Получить щелкнул нг-повторить пункт в родительском контроллере

var app = angular.module("MyApp", []); 

app.controller("ctrl", function($scope) { 
     $scope.slides = [{ 
      title: "Slide 1" 
     },{ 
      title: "Slide 2" 
     }]; 
     $scope.clicked = {title: "undefined slide"}; 
}); 

app.directive("scroller", function() { 
    return { 
    template: "<div slide ng-click='click()' ng-repeat='slide in slides'></div>" 
    }; 
}); 

app.directive("slide", function() { 
    return { 
    template: "{{slide.title}}", 
    controller: function($scope) { 
     // controller 
     $scope.click = function() { 
      // Tell parent I was clicked 
     } 
    }, 
    link: function(scope, element, attrs) { 
     // link 
    } 
    }; 
}); 

Я хочу clicked в главном контроллере быть slide, который щелкнул.


$scope.clicked = $scope.slide 

явно не работает из-за рамки повторения.


двухсторонняя привязка данных не работает, потому что это создаст Seconde область для элемента и, следовательно, шаблон из slide директивы бы перестать работать.


Я знаю, что

$scope.$parent.clicked = $scope.slide; 

будет работать, но я хотел бы попросить лучшее решение, потому что я не хотел получить доступ к родительской области, как это.

Может кто-нибудь, пожалуйста, помогите мне с этим? Может быть, трансляция щелкнутого элемента? Спасибо заранее.

ответ

0

Вы можете использовать опцию 'require' для этой директивы. Эта опция используется, чтобы указать, что ваш контроллер требует, чтобы другой работал правильно.

Ваш код должен выглядеть следующим образом:

var app = angular.module("MyApp", []); 

app.controller("ctrl", function($scope) { 
     $scope.slides = [{ 
      title: "Slide 1" 
     },{ 
      title: "Slide 2" 
     }]; 
     $scope.clicked = {title: "undefined slide"}; 

     this.slideClicked = function(slide){ 
      $scope.clicked = slide; 
     }; 
}); 

app.directive("scroller", function() { 
    return { 
    template: "<div>{{clicked.title}}</div><div slide ng-click='click(slide)' ng-repeat='slide in slides'></div>", 
    controller: 'ctrl' 
    }; 
}); 

app.directive("slide", function() { 
    return { 
    template: "{{slide.title}}", 
    require: '^scroller', 
    controller: function($scope) { 
     // controller 
     $scope.click = function(slide) { 
      $scope.containerController.slideClicked(slide); 
     } 
    }, 
    link: function(scope, element, attrs, controllers) { 
     scope.containerController = controllers;   

     // link 
    } 
    }; 
}); 

Вот https://jsfiddle.net/60zbpvau/1/

+0

Итак, мне нужно было бы переместить обработчик кликов на функцию ссылки, верно? – gerric

+0

Ну, вам не нужно его перемещать. Вы можете хранить ссылку на родительском контроллере в области вашего контроллера слайдов или даже добавлять ее к самому дочернему контроллеру (для этого вам нужно указать массив требуемых контроллеров. Они будут предоставлены вашей функции ссылок в виде массива. имеют доступ как к контроллерам слайда, так и к ctrl в функции ссылок и связывают их по своему желанию). –

+0

Я понимаю, что вы сделали, но по какой-то причине я получаю исключение «Нет контроллера» или просто нет вывода в зависимости от того, использую ли я 'ограничение' в директиве скроллеров. – gerric

0

Вы также можете хранить информацию в свойстве имущества $scope. Когда для дочерних элементов управления создается $scope, его свойства неглубоко копируются.

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