How to use the same controller for modal and non-modal form in Angular UI Bootstrap?

后端 未结 3 1809
栀梦
栀梦 2020-12-09 08:42

I\'ve got a modal with a registration form. The same form should be displayed at the bottom of the landing page not in a modal.

Currently my controller that handles

相关标签:
3条回答
  • 2020-12-09 09:25

    After struggling for a long while I found a easier trick to reuse our Controller for both modal and normal case.

    I found that we can pass caller's scope to modal controller, so I pushed modalInstance into $scope and passed it to the modal controller. Now you don't have unknown provider problem because $scope is a well known one.

    Below is an example:

    CallerController = function($rootScope, ...) {
       var modalScope = $rootScope.$new();
       modalScope.modalInstance = $modal.open({
            templateUrl: tempUrl,
            controller: ReusableModalController,
            scope: modalScope // <- This is it!
        });
    
        modalScope.modalInstance.result.then(function (result) {
            // Closed
        }, function () {
            // Dismissed
        });
    };
    
    ReusableModalController = function($scope, ...){
        var dataToSendBack = 'Hello World';
        $scope.modalInstance.close(dataToSendBack);
    };
    

    Cheers!

    0 讨论(0)
  • 2020-12-09 09:29

    If you are using ui-router you can easily use the resolve from ui-router to provide a $uibModalInstance (was $modalInstance before):

    $stateProvider
    .state('conductReview', {
        url: '/review',
        templateUrl: '/js/templates/review.html',
        controller: 'yourController',
        resolve: {
            $uibModalInstance: function () { return null; } // <- workaround if you want to use $uibModalInstance in your controller.
        }
    })
    

    That way you can use your modal controller like a normal controller. If you inject $uibModalInstance in your controller it will be null.

    0 讨论(0)
  • 2020-12-09 09:31

    If you want to use same controller for both modal form as well as landing page form, make use of

    modalInstance.result.then(function (selectedItem) { $scope.selected = selectedItem; }, function () { $log.info('Modal dismissed at: ' + new Date()); });

    You can get all the data from modal form in selectedItem and use this in landing page form. Also, how do you open the modal. If it is through a button, bind that ng-model to open modal using $modal.open.Don't create separate controller for your modal.Use the same one as your landing page. This way you can use 1 controller to open modal as well as other function after the modal is closed.

    PS: Code snippet given here is from angular ui's page. Check that page's documentation for selectedItem

    0 讨论(0)
提交回复
热议问题