AngularJS 指令找不到所需的控制器
AngularJS directive can't find required controller
要点是,在下面的代码中,我需要 'modalDirective' 来访问要创建的元素列表,它位于 'modalController' 中。我还需要 'modalDirective' 来创建一个 HTML 元素,该元素使用 ng-model 绑定到 'modalController' 内的作用域变量,所以如果有另一种方法可以做这些事情我完全开放。
我使用以下参数打开模式:
var modalOptions = {
templateUrl: 'targetUrl/modalPage.html',
controller: 'modalController'
}
ModalDialogFactory.openModal(modalOptions);
ModalDialogFactory 真的只是打开模式:
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);
}
}
};
}]);
模态打开,控制器工作正常。到目前为止,一切都很好。现在,我想在目标页面中使用一个指令:
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
}
};
});
然后在 modalPage.html 中,我引用了模态指令:
<div modal-directive></div>
这也有效,该指令按预期创建了动态 HTML 元素。当我想将这些元素之一绑定到 'modalController' 内的作用域变量时,问题就出现了。该指令似乎无法访问控制器,我认为这是某种范围界定问题,但我不确定我哪里出错了。我尝试将此行添加到 'modalDirective':
require: '^^modalController',
但是当我尝试请求控制器时出现错误:
Error: [$compile:ctreq] Controller 'modalController', required by directive 'modalDirective', can't be found!
有谁知道我错在哪里?
(假设,使用 uibModal,或另一个允许解析的 $modal)
我知道这晚了,但在浏览一些较旧的任务时遇到了这个问题。您的要求的问题是 $modal 服务将模态条目添加到控制器范围之外的 HTML (除非控制器是整页,这似乎不太可能)。
您可能不希望传递范围,而是希望利用 $modal 配置的 resolve 属性。所以你会做这样的事情:
- 创建将属性传递给解析属性的模态选项
- 做模态的东西
- Return 通过 $modalInstance.close() 您已经在做的任何更新
最终会是这样的:
ModalDialogFactory.showModal({
resolve: {
listOfStuff: function() { return $scope.list; }
}
});
这将使您 scope.listOfStuff 可以在您的指令中使用。
要点是,在下面的代码中,我需要 'modalDirective' 来访问要创建的元素列表,它位于 'modalController' 中。我还需要 'modalDirective' 来创建一个 HTML 元素,该元素使用 ng-model 绑定到 'modalController' 内的作用域变量,所以如果有另一种方法可以做这些事情我完全开放。
我使用以下参数打开模式:
var modalOptions = {
templateUrl: 'targetUrl/modalPage.html',
controller: 'modalController'
}
ModalDialogFactory.openModal(modalOptions);
ModalDialogFactory 真的只是打开模式:
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);
}
}
};
}]);
模态打开,控制器工作正常。到目前为止,一切都很好。现在,我想在目标页面中使用一个指令:
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
}
};
});
然后在 modalPage.html 中,我引用了模态指令:
<div modal-directive></div>
这也有效,该指令按预期创建了动态 HTML 元素。当我想将这些元素之一绑定到 'modalController' 内的作用域变量时,问题就出现了。该指令似乎无法访问控制器,我认为这是某种范围界定问题,但我不确定我哪里出错了。我尝试将此行添加到 'modalDirective':
require: '^^modalController',
但是当我尝试请求控制器时出现错误:
Error: [$compile:ctreq] Controller 'modalController', required by directive 'modalDirective', can't be found!
有谁知道我错在哪里?
(假设,使用 uibModal,或另一个允许解析的 $modal)
我知道这晚了,但在浏览一些较旧的任务时遇到了这个问题。您的要求的问题是 $modal 服务将模态条目添加到控制器范围之外的 HTML (除非控制器是整页,这似乎不太可能)。
您可能不希望传递范围,而是希望利用 $modal 配置的 resolve 属性。所以你会做这样的事情:
- 创建将属性传递给解析属性的模态选项
- 做模态的东西
- Return 通过 $modalInstance.close() 您已经在做的任何更新
最终会是这样的:
ModalDialogFactory.showModal({
resolve: {
listOfStuff: function() { return $scope.list; }
}
});
这将使您 scope.listOfStuff 可以在您的指令中使用。