【问题标题】:Unknown Provider Error, Dependency Injection, Modal Controller未知的提供者错误、依赖注入、模态控制器
【发布时间】:2016-02-16 14:39:57
【问题描述】:

我正在尝试构建一个自定义模式服务来接受数据并使用这些输入生成一个模式;但是,当将控制器的文字标识符传递给模态的controller 属性时,我收到了未知的提供者错误是 Angular。

我的应用程序的其他地方有依赖注入;它只是失败了,在这里。我知道,关于 SO 处理这个问题有很多问题;但是,在我读过的那些中,我无法找到一个更通用的答案,这可能会开始为我指明正确的方向。

这是我的服务代码:

angular.module('app').service('CustomModalService', ['$uibModal', function ($uibModal) {

    this.openCustomModal = function (size, title, message, action) {
        var actionToPerformOnConfirm = action;

        var modalInstance = $uibModal.open({
            templateUrl: 'templates/CustomModal.html',
            controller: 'CustomModalInstanceController',
            controllerAs: 'vm',
            size: size,
            resolve: {
                content: function () {
                    return {
                        title: title,
                        message: message
                    };
                }
            }
        });

        modalInstance.result.then(function (actionToPerformOnConfirm) {
            console.log('something happened');
        }.bind(this));
    };
}]);

这是上面引用的模态控制器:

angular.module('app').controller('CustomModalInstanceController', function ($uibModalInstance, content) {
    var vm = this;

    vm.title = content.title;
    vm.message = content.message;

    $scope.confirmAction = function () {
        $uibModalInstance.close();
    };

    $scope.cancelAction = function () {
        $uibModalInstance.dismiss('cancel');
    };
});

根据我对 Angular 的理解,这应该足够了。 如果控制器引用被删除,则此服务中一切正常,否则

甚至还有this question(我遇到的所有问题的一个很好的总结)证实了我在网上看到的文档和众多示例;但是,我仍然收到未知的提供者错误。这个用户甚至问same question(再次,从我所见,我的代码是一个“正确”的光辉例子)!

为了说明两者都在同一个目录下,下面是目录结构图:

我需要从哪里着手解决这个问题?这是应用程序配置问题吗?

【问题讨论】:

  • 未知提供者错误通常是由于找不到服务或控制器,您的服务和控制器在不同的目录中吗?
  • @ManuAntony 他们在同一个目录中,在这里。他们确实会被吐出到一个缩小的文件中。如果有帮助,会发布目录结构的图像吗?
  • 这对您的应用如何将控制器拼凑在一起也会有所帮助?从外观上看,您的控制器在您的应用中未定义,如果您刚刚添加了控制器,请尝试重新启动您的开发环境
  • @ManuAntony 实际上,这是一个好问题。我对 Angular 场景比较陌生。最初的架构师似乎包含了一个routes.js 文件,其中包含对注入的$stateProvider 的调用。在这里,模板被映射到控制器。奇怪的是我不必修改这个文件来包含我的服务(不知道这是否正常)。如果被控制者没有在这里注册,那会是罪魁祸首吗?
  • 我的问题可能听起来很傻,但是你能检查传入控制器的参数是否正确吗? $uibModalInstance, content 。或者更好的是,您可以删除控制器中的所有内容,只是一个空控制器,没有参数,看看您是否仍然收到错误?

标签: javascript angularjs


【解决方案1】:

我将回答我自己的问题,非常感谢 Manu Antony 与我合作。问题不在于控制器本身的注入,而在于提供给控制器的参数。

最后,这是我的语法错误。

这是正确的控制器签名语法(我添加了有趣的范围):

angular.module('app').controller('CustomModalInstanceController', ['$scope', '$uibModalInstance', 'content', function ($scope, $uibModalInstance, content) { ...

【讨论】:

    【解决方案2】:

    当我确实遇到这些问题时,它们非常令人沮丧。我为解决这些问题采取的步骤是返回到 html 中的 script 标签,并确保 ID 与 templateUrl 相同。所以在这里我向你展示我在哪里创建我的模态:

      var editPatient = $uibModal.open({    //Here is where the modal gets created. you set the html page and the controller
            templateUrl: 'EditPatientData.html',
            controller: 'EditPatientData',
            size: size,
            resolve: {
                data: function () {
                    return angular.copy(patientModel);
                }
            }
        });
    

    现在下面我将向您展示我的 Html 文件中映射到上面代码的代码。确保脚本标签中的 ID 与您的 js 中的完全相同。 (我建议你使用复制和粘贴来避免拼写错误。)

    <script type="text/ng-template" id="EditPatientData.html">
        <div class="modal-header">
            <h3 class="modal-title">Edit Patient Data</h3>
        </div>
        <div class="modal-body">
         //whatever you want to display
        </div>
    </script>
    

    希望这能回答您的问题。如果您需要更多帮助或更多规范,请随时提出。 :)

    【讨论】:

    • 不确定这是否会像 OP 所建议的那样解决它** 在此服务中一切正常,否则,如果控制器引用被删除。 ** ,我猜控制器有问题
    • @ManuAntony 当我遇到他所说的许多相同的问题时,这些是我寻找并尝试解决的要点。他应该试试我所说的,看看会发生什么。
    • @James 你能发布你的控制器吗?我在将数据从模式服务传递到控制器时遇到问题
    • @Thomas 澄清一下,您想要哪个控制器?主控制器还是模态控制器?
    • @James 模态。如果你也可以看看我的例子,那就太好了。我遇到的问题是获取参数。解决
    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 2014-12-15
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 2021-04-23
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多