在AngularJS中包装控制器

时间:2014-06-28 14:50:41

标签: angularjs

如何指定控制器应该是JavaScript中的另一个控制器的子节点而不是HTML?

例如,在pageCtrl上,我有一个名为modalBlog的方法,它以模态(Angular-UI)打开博客文章。我想将控制器指定为{{1}和我在实际博客页面上使用的一样。我想传递它输入(即博客文章ID。)有没有办法做类似的事情:

BlogCtrl

现在,通过设置$scope.modalBlog = function(postId) { var modalInstance = $modal.open({ templateUrl: '...', controller: function(..) { // Set some variables // ... // set BlogController as a child controller to this } }; ,它的父级是路由范围(来自ui.router的controller: 'BlogCtrl'),或者是视觉上的:

因此,层次结构是:

$state

但是当我指定一个匿名函数时,我得到:

+-Root
|---- PageCtrl
|---- BlogCtrl

有没有办法(只用JavaScript)来实现这种层次结构?

+-Root
|--+- PageCtrl
   +--+- <Anonymous function>

我的动机是重新使用+-Root |--+- PageCtrl +--+- <Anonymous function> +--+- BlogCtrl 中的代码来下载帖子。

我认为实现相同的功能/最终目标的完全替代方法是:

  • 创建一个BlogCtrl这个匿名函数和BlogService都可以使用,
  • 甚至加载具有指定BlogCtrl作为控制器
  • 的标记的视图

虽然我认为在这种特殊情况下这些方法会更好,但我很好奇是否有办法通过JavaScript在AngularJS中指定范围的层次结构(而不​​是在HTML中设置相当直的前进。)

更新

我认为我给出的第二个选项是最好的(我在编写这个问题时只考虑过它)来实现我需要的功能。

所以,我的功能是:

BlogCtrl

};

而不是指向$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),但这并不算太糟糕。我仍然对如何在纯Javascript中设置结构感到好奇。

1 个答案:

答案 0 :(得分:0)

根据我的理解,您要实现的是能够使用模态(子)状态调用父控制器中定义的匿名函数。

在不访问范围的情况下定义匿名函数。然后,不是将控制器传递给模态,而是传递匿名函数。

在父控制器中:

$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; }
        }
    });
};

您应该能够根据模态控制器的需要传递尽可能多的可重用函数。

如果您也尝试重用视图,我不清楚这种重用的条件是什么。