如何在JavaScript中而不是HTML中指定一个控制器应该是另一个控制器的子代?
例如,在pageCtrl
上,我有一个名为modalBlog
的方法,该方法以模式(Angular-UI)打开博客文章。我想将控制器指定为BlogCtrl
,与我使用的相同在实际的博客页面上。我想通过它输入(即博客文章ID)。有没有办法做这样的事情:
$scope.modalBlog = function(postId) {
var modalInstance = $modal.open({
templateUrl: '...',
controller: function(..) {
// Set some variables
// ...
// set BlogController as a child controller to this
}
};
现在,通过设置
controller: 'BlogCtrl'
,它的父级是路由范围(来自ui.router的$state
),或者在视觉上:因此,层次结构为:
+-Root
|---- PageCtrl
|---- BlogCtrl
但是当我指定一个匿名函数时,我得到:
+-Root
|--+- PageCtrl
+--+- <Anonymous function>
有没有办法(仅使用JavaScript)实现此层次结构?
+-Root
|--+- PageCtrl
+--+- <Anonymous function>
+--+- BlogCtrl
动机是重新使用
BlogCtrl
中的代码来下载帖子。我认为完全相同的功能/最终目标的替代方法是:
创建一个
BlogService
,该匿名函数和BlogCtrl
都可以使用,甚至加载带有将
BlogCtrl
指定为控制器的标签的视图虽然我认为在这种情况下这些方法会更好,但我很好奇是否有一种方法可以通过JavaScript在AngularJS中指定作用域的层次结构(而不是在HTML中直接设置)。
更新:
我认为我提供的第二个选项是实现所需功能的最佳方式(我在写此问题时才想到)。
因此,我的功能是:
$scope.modalBlog = function(postId) {
var modalInstance = $modal.open({
templateUrl: '...',
controller: function(..) {
// Set some variables and functions
}
};
我没有指向
views/blog.html
,而是指向views/blog-modal.html
,其顶部标记为:<section ng-controller="BlogCtrl">
这给了我设计的结构,其中上面的控制器功能是
BlogCtrl
的父级。这导致视图有些重复,因为我不确定如何有条件地设置控制器(例如
ng-controller="modal?BlogCtrl:not BlogCtrl"
),但是还算不错。不过,我仍然对如何在纯Javascript中设置结构感到好奇。 最佳答案
据我了解,您要实现的目标是能够以模式(子)状态调用在父控制器中定义的匿名函数。
在不访问范围的情况下定义匿名函数。然后,不将控制器传递给模态,而传递匿名函数。
在父控制器中:
$scope.getpost= function (postId) {
...
};
模态:
$scope.modalBlog = function (postId) {
var modalWindow = $modal.open({
templateUrl: 'views/blog.html',
controller: 'editBlogController',
resolve: {
textid: function () { return postId; },
gettextfn: function () { return $scope.getpost; }
}
});
};
您应该能够传递模态控制器所需的尽可能多的可重用功能。
如果您还尝试重用视图,那么我不清楚这种重用的条件是什么。
关于angularjs - 在AngularJS中包装 Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24467985/