如何在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/

10-10 02:34