IT

angular 1.5에서 ui.bootstrap.modal과 함께 angular 구성 요소를 사용하는 방법

itgroup 2023. 2. 10. 21:44
반응형

angular 1.5에서 ui.bootstrap.modal과 함께 angular 구성 요소를 사용하는 방법

ui.bootstrap.modal과 angular 컴포넌트를 사용하고 싶습니다.각도 버전은 1.5입니다.
나는 아래와 같이 사용하려고 했다.

요소

function MyComponentController($uibModalInstance){
  var ctrl = this;

  ctrl.doSomething = function() {
    //doSomething
  }
}

app.component('myComponent', {
  contoller: MyComponentController,
  templateUrl: '/path/to/myComponent.html'
}

부모 컨트롤러

function parentController($uibModal){
  var ctrl = this;

  ctrl.openModal = function(){
    var modalInstance = $uibModal.open({
      template: '<my-component></my-component>'

  }
}

그리고 내가 실행했을 때parentController.openModal()모드창이 열려 있는데 $injector:unpr Unknown Provider 오류가 발생하였습니다.
ui.bootstrap.modal에서 angular 컴포넌트를 사용하는 방법이 있습니까?더 자세한 정보가 필요하시면 알려주세요.
감사해요.

편집
Renato Machado의 ui.bootstrap.modal과 함께 컴포넌트를 사용하는 방법이 있습니다.고마워요 Renato.
하지만 좀 복잡하고 불편하다고 느껴요.마지막으로 모달 내부에 컴포넌트를 사용하는 것이 좋다고 생각합니다.
모달은 통상적인 방법으로 열립니다(컨트롤러와 템플릿을 로 설정합니다).$uibModal.open({})모듈에는 일반적으로 사용하는 로직이 있는 컴포넌트가 포함되어 있습니다.
모달에는 모달 창 닫기처럼 모달과 관련된 단순한 논리만 있어야 합니다.
주로 비즈니스/어플리케이션과 관련된 다른 로직이 컴포넌트에 포함되어 있어야 합니다.
공통화를 쉽게 할 수 있습니다.

편집: UI Bootstrap 2.1.0에서는 부트스트랩 모달의 컴포넌트가 네이티브로 지원되고 있습니다.2.1.0 이후에 몇 가지 모듈 문제를 해결하기 위해 몇 가지 퀵 릴리즈가 있었던 것 같으니 최신 버전을 꼭 입수하겠습니다.

UI 부트스트랩 2.1.0+를 사용하는 버전은 이 Plunk를 참조하십시오.

http://plnkr.co/edit/jy8WHfJLnMMldMQRj1tf?p=preview

angular.module('app', ['ngAnimate', 'ui.bootstrap']);

angular.module('app')
  .component('myContent', {
     template: 'I am content! <button type="button" class="btn btn-default" ng-click="$ctrl.open()">Open Modal</button>',
     controller: function($uibModal) {
        $ctrl = this;
        $ctrl.dataForModal = {
        name: 'NameToEdit',
        value: 'ValueToEdit'
     }

    $ctrl.open = function() {
      $uibModal.open({
         component: "myModal",
         resolve: {
           modalData: function() {
             return $ctrl.dataForModal;
           }
         }
       }).result.then(function(result) {
            console.info("I was closed, so do what I need to do myContent's  controller now.  Result was->");
      console.info(result);
       }, function(reason) {
           console.info("I was dimissed, so do what I need to do myContent's controller now.  Reason was->" + reason);
       });
    };
  }
});

angular.module('app')
  .component('myModal', {
template: `<div class="modal-body"><div>{{$ctrl.greeting}}</div> 
<label>Name To Edit</label> <input ng-model="$ctrl.modalData.name"><br>
<label>Value To Edit</label> <input ng-model="$ctrl.modalData.value"><br>
<button class="btn btn-warning" type="button" ng-click="$ctrl.handleClose()">Close Modal</button>
<button class="btn btn-warning" type="button" ng-click="$ctrl.handleDismiss()">Dimiss Modal</button>
</div>`,
  bindings: {
    modalInstance: "<",
    resolve: "<"
  },
  controller: [function() {
    var $ctrl = this;
    $ctrl.$onInit = function() {
      $ctrl.modalData = $ctrl.resolve.modalData;
    }
    $ctrl.handleClose = function() {
      console.info("in handle close");
      $ctrl.modalInstance.close($ctrl.modalData);
    };
    $ctrl.handleDismiss = function() {
      console.info("in handle dismiss");
      $ctrl.modalInstance.dismiss("cancel");
    };
  }]
});

최초 답변은 다음과 같습니다.

나도 며칠 전에 이걸 알아내려고 했었어.이 투고에 기재되어 있는 정보를 이 링크와 함께 참고하여 이를 실현하기 위한 다른 방법을 생각해 보았습니다.다음은 도움이 되는 참조 링크입니다.

https://github.com/angular-ui/bootstrap/issues/5683

http://www.codelord.net/ (컴포넌트 내의 콜백에 인수를 전달하는 데 도움이 됩니다)

또한 http://plnkr.co/edit/PjQdBUq0akXP2fn5sYZs?p=preview의 Plunk도 있습니다.

나는 몇 가지 데이터를 편집하기 위해 모달(modal)을 사용하는 일반적인 현실 세계의 시나리오를 시연하려고 했다.

angular.module('app', ['ngAnimate', 'ui.bootstrap']);

angular.module('app')
.component('myContent', {
    template: 'I am content! <button type="button" class="btn btn-default" ng-click="$ctrl.open()">Open Modal</button>',
    controller: function($uibModal) {
        $ctrl = this;
        $ctrl.dataForModal = {
            name: 'NameToEdit',
            value: 'ValueToEdit'
        }
        $ctrl.open = function() {
            $uibModal.open({
                template: '<my-modal greeting="$ctrl.greeting" modal-data="$ctrl.modalData" $close="$close(result)" $dismiss="$dismiss(reason)"></my-modal>',
                controller: ['modalData', function(modalData) {
                    var $ctrl = this;
                    $ctrl.greeting = 'I am a modal!'
                    $ctrl.modalData = modalData;
                }],
                controllerAs: '$ctrl',
                resolve: {
                    modalData: $ctrl.dataForModal
                }
            }).result.then(function(result) {
                console.info("I was closed, so do what I need to do myContent's controller now and result was->");
                console.info(result);
            }, function(reason) {
                console.info("I was dimissed, so do what I need to do myContent's controller now and reason was->" + reason);
            });
        };
    }
});

angular.module('app')
.component('myModal', {
    template: `<div class="modal-body"><div>{{$ctrl.greeting}}</div> 
<label>Name To Edit</label> <input ng-model="$ctrl.modalData.name"><br>
<label>Value To Edit</label> <input ng-model="$ctrl.modalData.value"><br>
<button class="btn btn-warning" type="button" ng-click="$ctrl.handleClose()">Close Modal</button>
<button class="btn btn-warning" type="button" ng-click="$ctrl.handleDismiss()">Dimiss Modal</button>
</div>`,
    bindings: {
        $close: '&',
        $dismiss: '&',
        greeting: '<',
        modalData: '<'
    },
    controller: [function() {
        var $ctrl = this;
        $ctrl.handleClose = function() {
            console.info("in handle close");
            $ctrl.$close({
                result: $ctrl.modalData
            });
        };
        $ctrl.handleDismiss = function() {
            console.info("in handle dismiss");
            $ctrl.$dismiss({
                reason: 'cancel'
            });
        };
    }],
});

부모 컨트롤러를 전달함으로써 더 복잡해질 필요는 없습니다.모달 표시의 .component 내에서 액세스 할 수 있습니다.

요소

/**
 * @ngdoc component
 * @name fsad.component:video
 *
 * @description <fsad-video> component, in development...
 *
 */


(function () {
  'use strict';

  angular.module('fsad').component('fsadVideo', {
    bindings: {},
    templateUrl: function(appConstant){return appConstant.paths.modules.fsad + 'leefloon/fsad-video.html'},
    controller: controller
  });

  controller.$inject = ['$scope'];
  function controller($scope){

    var $ctrl = this;

    setDataModel();

    /****************************************************************/

    $ctrl.ui.close = close;

    /****************************************************************/

    function setDataModel(){

      $ctrl.ui = {};

    }
    function close(){
      $scope.$parent.$close();
    }

  }

}());

모달 열기

  var modalInstance = $uibModal.open({
    backdrop: 'static',
    keyboard: true,
    backdropClick: false,
    template: '<fsad-video></fsad-video>',
    windowClass: 'edit-contactenblad',
  });

템플릿이 컴포넌트이므로 $scope.$parent는 항상 모달인스턴스를 가리킵니다$close() 함수에 액세스할 수 있습니다.

데이터 송수신

데이터를 구성 요소에 전달하거나 구성 요소에서 데이터를 다시 받아야 하는 경우 다음과 같이 수행할 수 있습니다.

  var modalInstance = $uibModal.open({
    backdrop: 'static',
    keyboard: true,
    backdropClick: false,
    template: '<fsad-video method="$ctrl.method" on-viewed="$ctrl.userHasViewedVideo(time)"></fsad-ideo>',
    controller: function(){
      this.method = method;
      this.userHasViewedVideo = function(time){}
    },
    controllerAs: '$ctrl',
    windowClass: 'edit-medewerker',
  });

참고로 이 구조 스타일 가이드를 사용하여 컴포넌트를 만듭니다.

$uibModal에 $close() ★★★★★★★★★★★★★★★★★」$dismiss()함수는 컴포넌트 내의 일부 상위 데이터 및 함수 바인딩과 함께 다음과 같이 모두 전달할 수 있습니다.

오픈 모달 로직

$uibModal.open({
    template: '<login close="$close()" dismiss="$dismiss()" ' +
        'email="$ctrl.cookieEmail" check-login="$ctrl.ajaxLogin(user, pass)"></login>',
    controller: function () {
        this.cookieEmail = $cookies.get('savedEmail');
        this.ajaxLogin = AjaxLoginService.login;
    },
    controllerAs: '$ctrl'
});

모달 로그인 컴포넌트

{
    templateUrl: 'view/login.html',
    bindings: {
        email: '<',
        checkLogin: '&',
        close: '&',
        dismiss: '&'
    },
    controller: function () {
        var viewModel = this;

        viewModel.password = '';

        viewModel.submit = function () {
            viewModel.checkLogin(
                { user: viewModel.email, pass: viewModel.password }
            ).then(function (success) {
                viewModel.close();
            });
        }
    }
}

모달 HTML

<form ng-submit="$ctrl.submit()">
    <input type="text" ng-model="$ctrl.email" />
    <input type="password" ng-model="$ctrl.password" />
    <button type="button" ng-click="$ctrl.dismiss()">Cancel</button>
    <button type="submit">Login</button>
</form>

AngularJS.5 하지만 AngularJS 1.5의 .&함수 래퍼로서의 바인딩:https://docs.angularjs.org/guide/component

부모 컨트롤러를 모달인스턴스가 있는 모달컴포넌트에 전달해야 합니다.그러기 위해서는 모달의 생성 HTML을 부모 컴포넌트에 추가해야 합니다.

부모 성분

$ctrl.openModal = function(){
    $ctrl.modalInstance = $uibModal.open({
        template: '<your-modal></your-modal>',
        appendTo : $document.find('parentComponent')
    });
}

모달 성분

.component('yourModal', {
        templateUrl: 'path/to/modal.html',
        replace: true,
        require: {
            parent : '^parentComponent'
        },
        controller: ModalCtrl
    });

function ModalCtrl() {
    var $ctrl = this;

    $ctrl.$onInit = function(){

        var instance = $ctrl.parent.modalInstance;

        $ctrl.items = ['item1', 'item2', 'item3'];

        $ctrl.selected = {
            item: $ctrl.items[0]
        };

        $ctrl.ok = function () {
            instance.close($ctrl.selected);
        };

        $ctrl.cancel = function () {
            instance.dismiss('cancel');
        };

        instance.result.then(function (selectedItem) {
            $ctrl.selected = selectedItem;
        }, function () {
            console.log('Modal dismissed at: ' + new Date());
        });
    };


}

필요한 컨트롤러는 $onInit 이후에만 사용할 수 있으므로 주의하십시오.

언급URL : https://stackoverflow.com/questions/36401375/how-to-use-angular-component-with-ui-bootstrap-modal-in-angular-1-5

반응형