Angularjs 如何在Angular UI引导中对模态和非模态窗体使用相同的控制器?

Angularjs 如何在Angular UI引导中对模态和非模态窗体使用相同的控制器?,angularjs,angular-ui,angular-ui-bootstrap,Angularjs,Angular Ui,Angular Ui Bootstrap,我有一个带登记表的模型。相同的表单应显示在登录页的底部,而不是以模式显示 目前,我处理注册模式的控制器将$modalInstance作为其参数之一,以及$scope等。如果我将ng controller=“SignUpCtrl”添加到登录页中的某个元素,它将不起作用,由于控制器不是通过$modal.open方法创建的,因此Angular抱怨未知提供程序:$modalInstanceProvider如果您想对模式表单和登录页表单使用相同的控制器,请使用 modalInstance.result.t

我有一个带登记表的模型。相同的表单应显示在登录页的底部,而不是以模式显示


目前,我处理注册模式的控制器将
$modalInstance
作为其参数之一,以及
$scope
等。如果我将
ng controller=“SignUpCtrl”
添加到登录页中的某个元素,它将不起作用,由于控制器不是通过
$modal.open
方法创建的,因此Angular抱怨
未知提供程序:$modalInstanceProvider如果您想对模式表单和登录页表单使用相同的控制器,请使用

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

您可以在
selectedItem
中从模式表单获取所有数据,并在登录页表单中使用。 另外,如何打开模态。如果是通过按钮,请使用
$modal.open
将ng模型绑定到打开modal。不要为您的modal创建单独的控制器。请使用与登录页相同的控制器。通过这种方式,您可以使用1个控制器打开模态以及模态关闭后的其他功能


PS:这里给出的代码片段来自。查看该页面的文档,查看selectedItem

经过长时间的努力,我发现了一个更简单的方法,可以在模式和正常情况下重用我们的控制器

我发现我们可以将调用者的作用域传递给模态控制器,所以我将modalInstance推入$scope并将其传递给模态控制器。 现在您不存在未知提供程序问题,因为$scope是一个众所周知的问题

以下是一个例子:

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);
};
CallerController=函数($rootScope,…){
var modalScope=$rootScope.$new();
modalScope.modalInstance=$modal.open({
templateUrl:tempUrl,
控制器:可重用的ModalController,

范围:modalScope/如果您使用的是ui路由器,您可以轻松使用“从ui路由器解析”来提供$uibModalInstance(以前是$modalInstance):

$stateProvider
.状态(“conductReview”{
url:“/review”,
templateUrl:“/js/templates/review.html”,
控制器:“您的控制器”,
决心:{

$uibModalInstance:function(){return null;}//是否使用“UI引导”模态?如果你能提供一些代码,那会有所帮助。我目前似乎正在处理一个类似的问题。我现在通过使用事件解决了这个问题。我没有将
$modalInstance
传递给处理表单和注册逻辑并关闭模态的控制器,而是触发一个事件并在调用的控制器中侦听它d
$modal.open
。这里有一个片段:我已经给出了答案,可能会有帮助[go][1][1]:谢谢,但是这个解决方案有一个问题,因为(如果我正确理解文档)您必须关闭模式才能传递数据。如果您关闭模式,但注册失败(例如,因为电子邮件已被接收),该怎么办?这就是为什么我在控制器内处理传递给
$modal的实际逻辑。打开
-以便能够在不关闭模式的情况下处理错误。是的,模式需要关闭。但您仍然可以执行l你为什么不创建一个plunk或fiddle,它会帮助人们解决你的问题,但这正是问题所在。如果我将逻辑移到依赖于
$modalInstance
的modal控制器,问题是如何在没有
$modalInstance
的地方重用它。他说re是我目前的解决方案,不需要太多的代码更改(例如创建新服务),但可能还有更好的方法。为什么不直接在模式控制器中使用逻辑。如果您想重用代码,您可以始终使用服务。编辑:我认为您应该将服务用于您的逻辑,并将该服务作为依赖项添加到模式控制器中。谢谢,我正在使用该代码将数据从模式传递到调用方控制器,并且可以正常工作这就像一个charme:DJust beauty!我最终使用了
$scope.modalInstance=$modal.open({[…]scope:$scope});
@jsruok如果你不愿意,请小心不要覆盖调用方控制器的变量:)谢谢你!我在胡思乱想
var modalScope=$rootScope.$new();
。根据文档,
范围-用于模式内容的范围实例(实际上$modal服务将创建所提供范围的子范围)。默认值为$rootScope
@Aniket Sinha,因此正如它所说,模态使用一个作用域,如果我们没有在
$modal.open中指定它,模态将自动创建一个作用域({…作用域:modalScope…})
。在这种情况下,我们希望以一种巧妙的方式将我们的
modalInstance
传递到模态中,也就是说,我使用
var modalScope=$rootScope.$new();
创建一个作用域,然后将
modalInstance
推到新的
modalScope
中,最后告诉模态“不要创建作用域,使用我给你的”对不起,我的英语不好。。。
$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.
    }
})