5

이 $ mdDialog로 처음으로 작업했습니다. 외부 HTML 템플릿을 사용하여 대화 상자를 만드는 데 사용되었습니다.

지금까지는 너무 좋았습니다 ... 템플릿을 열 수는 있지만 ng-click은 더 이상 작동하지 않습니다.

그리고 그 이유를 찾을 수 없습니다.

<md-icon 
     layout="row" 
     flex md-font-set="material-icons" 
     class="active" 
     ng-click="vm.showMenu($event)"> 
    menu 
</md-icon> 

userController에 $ mdDialog을 열 수있는 방법 :

mdDialog이 같은 userController에서 호출되는

vm.showMenu = function showMenu(ev){ 

    $mdDialog.show({ 
     controller: MenuDialogController, 
     templateUrl: 'app/components/head/user/menu.dialog.html', 
     parent: angular.element($document.body), 
     targetEvent: ev, 
     clickOutsideToClose:true, 
     fullscreen: $scope.customFullscreen // Only for -xs, -sm breakpoints. 
    }) 
     .then(function(answer) { 
      $scope.status = 'You said the information was "' + answer + '".'; 
     }, function() { 
      $scope.status = 'You cancelled the dialog.'; 
     }); 
}; 

을 그리고 이것은 대화 상자에서 버튼에 대한 대화 컨트롤러 작동하지 않습니다 :

angular 
    .module('trax') 
    .controller('MenuDialogController', MenuDialogController); 

function MenuDialogController() { 

    var vm = this; 

    vm.close = function close(){ 
     alert('close clicked'); 
    } 

    vm.ok = function ok(){ 
     alert('ok clicked'); 
    } 

} 

그리고 이것은 dia의 html 코드입니다. logController :

<md-dialog aria-label="User Menu"> 
    <form ng-cloak> 
     <md-toolbar> 
      <div class="md-toolbar-tools"> 
       <h2>User Menu</h2> 
       <span flex></span> 
       <md-button class="md-icon-button" ng-click="vm.close($event)"> 
        <md-icon md-font-set="material-icons">close</md-icon> 
       </md-button> 
      </div> 
     </md-toolbar> 

     <md-dialog-content> 
      <div class="md-dialog-content"> 
       <h2>Dialog Title</h2> 
       <p>Dialog Text....</p> 
       <p ng-click="vm.test($event)">test</p> 
      </div> 
     </md-dialog-content> 

     <md-dialog-actions layout="row"> 
      <md-button href="http://en.wikipedia.org/wiki/Mango" target="_blank" md-autofocus> 
       More on Wikipedia 
      </md-button> 
      <span flex></span> 
      <md-button ng-click="vm.close($event)"> 
       cancel 
      </md-button> 
      <md-button ng-click="vm.ok($event)"> 
       ok 
      </md-button> 
     </md-dialog-actions> 
    </form> 
</md-dialog> 

ng-clicks가 작동하지 않습니다!

나에게 어떤 힌트가 있습니까?

+0

가 대신 코드 조각으로 이러한 파일을 추가 할 수 $mdDialog.show 도우미 메서드에 controllerAs: "vm"를 선언 동일 $scope

$scope.close = function() { ... }; $scope.ok = function() { ... }; 

로 직접 메소드를 선언입니까? 다른 사람들이 코드를보기 위해 특정 URL로 이동해야하는 대신 도움이 될 것입니다. 또한 [tag : angle-material] 태그 대신 [tag : angularjs-material] 태그를 사용하십시오. – Edric

+0

plunker에서 데모 프로젝트를 만들 수 있습니까? – Vishal

+0

안녕하세요, 귀하의 routeConfiguration을 보여 주실 수 있습니까? 당신이 vm'이'MenuDialogController'의 범위에 존재하지 않는'당신의 NG-클릭이'vm'라는 뭔가 바인더 제본,하지만 때문에 controllerAs'전달하지 않았기 때문에 나는이 의심 –

답변

1
angular 
    .module('trax') 
    .controller('MenuDialogController', MenuDialogController); 

function MenuDialogController() { 

    var vm = this; 

    //Here change vm to $scope 
    $scope.close = function close(){ 
     alert('close clicked'); 
    } 

    $scope.ok = function ok(){ 
     alert('ok clicked'); 
    } 

} 

당신은 그것을 약간 떨어져 당신의 설정을 텟 나타납니다 귀하의 대화 컨트롤러

+0

OKI,이 작동하지만 이벤트는 다음과 같이 구현됩니다 : 그것은 NG 클릭 = "ctrl.close ($ 이벤트) '같은 경우 ="가까운 ($ 이벤트) "이 더 좋을 wouldnt한다을 클릭 NG? 대화 상자를 다시 닫는 방법은 무엇입니까? 내 컨트롤러 this.hide의 범위에서()이 ... 당신은 $ 범위의 속성을 오류로 설정해서는 안됩니다 – n00n

+0

작동하지만 $의 scope.close = 기능 가까운() {...} 에 오류가 발생하지 않습니다 컨트롤러에서. ControllerAs 구문을 사용하고 "this"에 데이터를 추가하십시오. – n00n

+0

그런 오류가 없습니다. 당신이 사용하고 싶은 개인적인 선택. 컨트롤러는 직접 스코프 또는 직접 스코프로 사용됩니다. 그래서 당신이 좋아하는 것을 사용하십시오. – Hey24sheep

0

의 $ 범위에 funcs를 할당해야합니다. 실제로이 대화 상자에 범위를 전달하려는 것 같습니다. 이 패턴과 일치하는 구현을 수정해야합니다 같은

// Dialog #3 - Demonstrate use of ControllerAs and passing $scope to dialog 
//    Here we used ng-controller="GreetingController as vm" and 
//    $scope.vm === <controller instance=""> 

... 나는 다음을 찾을 수 있었다 $mdDialog docs의 예에서 찍은 것 같습니다.

$mdDialog.show({ 
    controller: MenuDialogController, 
    templateUrl: 'app/components/head/user/menu.dialog.html', 
    parent: angular.element($document.body), 
    targetEvent: ev, 
    clickOutsideToClose:true, 
    fullscreen: $scope.customFullscreen, 
    scope: $scope,   // use parent scope in template 
    preserveScope: true, // do not forget this if use parent scope 
}).then(function(answer) { 
    $scope.status = 'You said the information was "' + answer + '".'; 
}, function() { 
    $scope.status = 'You cancelled the dialog.'; 
}); 

공지 지정된 scopepreserveScope 옵션을 ... 다음을 시도하십시오. 코드를 떠날

// Since MenuDialogController is instantiated with ControllerAs syntax 
// AND we are passing the parent '$scope' to the dialog, we MUST 
// use 'vm.<xxx>' in the template markup 
+0

나는 그것을 보았다. 하지만 약속을 내 MenuDialogController에서 해지시키는 방법은 무엇입니까? scope/root 범위에서 이벤트를 발생시켜 MenuDialogController에서보기? – n00n

+0

나는 확신 할 수 없다. 그러나 문제를 재현하는 [plunker] (https://plnkr.co/)를 제공 할 수 있다면 기꺼이 해결하도록 도와 드리겠습니다. – scniro

+0

thx. 그것은 작동하지만, .. 내 단위 테스트는 위에서 설명한대로 실패합니다. – n00n

1

은 당신이 당신의 템플릿에서 사용할 수있는이 방법으로

var vm = this; 
$scope.vm = vm; 

var vm = this; 

후 추가 할 필요가 수정되지 않은.

또 다른 방법은 첫 번째 방법은