AngularJS指令找不到所需的控制器

时间:2018-10-18 15:21:43

标签: angularjs angularjs-directive angularjs-controller

要点是,在下面的代码中,我需要“ modalDirective”来访问要创建的元素列表,这些元素位于“ modalController”内部。我还需要'modalDirective'创建一个HTML元素,该元素使用ng-model绑定到'modalController'内部的作用域变量,因此,如果有另一种方法可以执行上述任一操作,则我完全可以接受。

我使用以下参数打开模态:

firebase.firestore
        .collection('a').doc('b')
        .collection('c')
        .doc('docID').get()
        .then((doc) => {

ModalDialogFactory实际上只是打开模式:

var modalOptions = {
    templateUrl: 'targetUrl/modalPage.html',
    controller: 'modalController'
}
ModalDialogFactory.openModal(modalOptions);

模态打开,控制器正常工作。到目前为止,一切都很好。现在,在目标页面中,我想使用一个指令:

angular.module('myApp')
.factory('ModalDialogFactory', ['$modal', '$rootScope', function ($modal, $rootScope) {
    var modalDialogDefaults = {
        backdrop: 'static',
        keyboard: false,
        scope: $rootScope.$new()
    };
    var modalInstance;
    return {
        showModal: function (modalOptions) {
            var modalConfig = {};
            angular.extend(modalConfig, modalDialogDefaults, modalOptions);
            modalInstance = $modal.open(modalConfig);
            return modalInstance.result;
        },
        closeModal: function (selectedObjs) {
            if (modalInstance != null) {
                modalInstance.close(selectedObjs);
            }
        }
    };

}]);

然后在modalPage.html中,我引用模式指令:

angular.module('myApp').directive('modalDirective', function ($q, $http, $compile) {
return {
    restrict: 'EAC',
    compile: function(element, attr) {
              return function(scope, element, attr) {
              // Dynamically create new HTML elements   
    }
};
});

这也有效,该指令按预期创建了动态HTML元素。当我想将这些元素之一绑定到“ modalController”内的作用域变量时,问题就出现了。该指令似乎没有访问控制器的权限,我认为这是某种范围确定的问题,但我不确定我要去哪里。我尝试将此行添加到“ modalDirective”中:

<div modal-directive></div>

但是当我尝试并要求控制器时,出现错误:

require: '^^modalController',

有人知道我要去哪里吗?

1 个答案:

答案 0 :(得分:1)

(假设使用uibModal或允许解析的另一个$ modal)

我知道聚会晚了,但是在浏览一些较旧的任务时遇到了这个问题。您需要解决的问题是$ modal服务会将模式项添加到控制器范围之外的HTML中(除非控制器是整个页面,这似乎不太可能)。

您可能希望利用$ modal配置的resolve属性,而不是期望通过范围。所以你会做类似的事情:

  • 创建将属性传递给resolve属性的模式选项
  • 做你的情态东西
  • 通过您已经在执行的$ modalInstance.close()返回所有更新

它最终会像这样:

ModalDialogFactory.showModal({
    resolve: {
        listOfStuff: function() { return $scope.list; }
    }
});

这将使您可以在指令中使用scope.listOfStuff。