2015-12-18 3 views
1

У меня есть контроллер:

function myController($scope) { 
    $scope.clicked = false; 
} 

и директива:

function myDirective() { 
    return { 
     restrict: 'E', 

     link: function(scope, elem, attrs) { 

      elem.bind('click', function() { 
       // need to update controller $scope.clicked value 
      }); 
     }, 

     template: '<div>click me</div>'; 
     replace: true; 
    } 
} 

и I'm, используя его как это:

<div ng-controller="myController"> 
    <my-directive></my-directive> 
</div> 

Как могу ли я изменить значение контроллера $ scope.clicked? спасибо!

ответ

1

Поскольку вы не используете изолированную область действия в своей директиве, вы можете использовать scope.$parent.clicked для доступа к родительскому объекту.

link: function(scope, elem, attrs) { 
      elem.bind('click', function() { 
       scope.$parent.clicked = ... 
      }); 
     }, 
+0

сферы $ родительских спас меня :) Спасибо –

+0

не хорошая практика. – carmelolg

1

Я бы не рекомендовал использовать scope.$parent обновить или получить доступ к значениям родительской области, вы можете two way bind переменную контроллер, который должен быть обновлен в вашу директиву, так что ваша директива становится:

function myDirective() { 
    return { 
     restrict: 'E', 
     scope: { 
     clicked: '=' 
     }, 
     link: function(scope, elem, attrs) { 

      elem.bind('click', function() { 
       // need to update controller $scope.clicked value 
       $scope.clicked = !$scope.clicked; 
      }); 
     }, 

     template: '<div>click me</div>'; 
     replace: true; 
    } 
} 

прямо сейчас передать это clicked от родителей:

<div ng-controller="myController as parentVm"> 
    <my-directive clicked="parentVm.clicked"></my-directive> 
</div> 

function myController() { 
    var parentVm = this; 
    parentVm.clicked = false; 
} 

Я рекомендовал бы читать на использовании controllerAs SY ntax для вашего контроллера, поскольку это действительно упростило бы концепцию использования двухстороннего связывания здесь.

+0

Приятно отметить, что использование синтаксиса controllerAs –

+0

Вы неправильно использовали 'controller as'. –

1

Мне нравится использовать $ scope. $ Emit для таких целей. Он позволяет отправлять данные из директивы в контроллер. Вы должны создать пользовательский слушателю в контроллере:

$scope.$on('cliked-from-directive', function(event, data){ 
     console.log(data) 
}) 

Как вы можете видеть, теперь у вас есть полный доступ к вашей области контроллера, и вы можете делать все, что вы хотите. И в вашей директиве просто использовать scope.$emit ссылки:. Функции (сфера деятельности, Эль, AttrS) {

 elem.bind('click', function() { 
      scope.$emit('cliked-from-directive', {a:10}) 
     }); 

Здесь я создал jsfiddle для вас

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