2016-10-05 3 views
0

Я определил одну переменную в контроллере, и я присвоил это значение одному атрибуту настраиваемой директивы. Поэтому, основываясь на этом значении, я показываю шаблон модального окна. Теперь, если я нажимаю кнопку отмены из шаблона модального окна, он вызывает одну функцию от контроллера, которая изменяет значение переменной на false, но не скрывает всплывающее окно. Пожалуйста, помогите мне исправить это.Как получить измененные значения от контроллера к пользовательской директиве?

(function() { 
'use strict'; 

angular.module('module1').directive('myDirective', function() { 
    function linkFunction(scope, elem, attrs) { 
     //scope.openvalue = attrs.openvalue; 
     scope.closevalue = false; 
     scope.close = function() { 
      console.log("Inside Close"); 
      scope.openvalue = false; 
      scope.closevalue = false; 
     }; 
    }; 

    return { 
     templateUrl: 'confirmTemplate.html', 
     restrict: 'E', 
     link: linkFunction, 
     scope: { 
      confirmtext: '@', 
      openvalue: '=', 
      closeconfirm: '&', 
      submitconfirm: '&' 
     }, 
     controller: ['$scope', function ($scope) { 
      $scope.$watch('openvalue', function() { 
       console.log("OpenValue : " + $scope.openvalue); 
      }); 
     }] 
    }; 
}); 
})(); 

Ниже приведено html для открытия этого модального.

<div class="col-xs-12 options" ng-click="cntrl.flag1 = true"> 
    <div class="row"> 
    <myDirective openvalue="cntrl.flag1" confirmtext="This is the text from directive" 
       closeconfirm="cntrl.closeconfirm()" submitconfirm="cntrl.submitconfirm()"></myDirective> 
    <div class="col-xs-9 no-left-right-padding">My text</div> 
    </div> 
</div> 

И я хочу обновленное значение openvalue внутри html-шаблона, но оно не работает.

+0

Что вы пробовали? Было бы полезно увидеть связанный код. – palra

ответ

0

Было бы более ясно, есть ли у вас кода, но я думаю, что проблема при вызове функции из контроллера, он фактически не изменять переменную контроллера области видимости, но объем модального в.

В области AngularJS любое изменение унаследованной переменной в области child создаст локальную версию.

Основываясь на ваших словах, при открытии модального окна он создаст новую область с дочерними объектами, и когда вы вызовете функцию контроллера, чтобы изменить эту переменную области видимости, вы фактически изменяете эту переменную области дочернего объекта, а не контроллер.

Вы можете просто добавить console.log($scope.$id); в контроллер, и функция затем вы сможете увидеть, что идентификатор области отличается.

Fiddle даст вам идею, нажмите на кнопку Esc, чтобы закрыть окно. Однако, как я сказал, было бы лучше, если бы ваш код обратился к точной проблеме.


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

Изменить модальность в

<myDirective cntrl="cntrl" confirmtext="This is the text from directive"></myDirective> 

в вашей директиве

scope: { 
    confirmtext : '@', 
    cntrl  : '=' 
}, 

в вашем linkFunction

function linkFunction(scope, elem, attrs){ 
    scope.close = function(){ 
     scope.cntrl.flag1 = false; 
    } 

вы все еще можете получить доступ к closeconfirm и submitconfirm по $scope.cntrl.closeconfirm и $scope.cntrl.submitconfirm соответственно.

+0

Ох это означает, что мы также можем изменить значения контроллера внутри директивы –

+0

Если вы перейдете в 'cntrl' и убедитесь, что вы не изменяете ссылку на объект в директиве, то да вы можете манипулировать свойствами (значениями) директивы' cntrl' внутри как пожелаете. –

+0

так ли это на самом деле решить вашу проблему? –

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