0

如何从代码中实例化自定义控制器并保留作用域继承。换句话说,我想做这样的事情:

var controller = 'myCtrl';
var html = '<p>{{value}}</p>';
var validScope= $scope.$new({
    value : 'Hello, custom controllers'
}); // Or something like this to get valid scopes inheritance
$(document.body).append(instantiate(controller, html, validScope));

所以我需要两个答案:如何实例化自定义控制器以及如何像 Angular 那样做。

升级版。我试过这样做:

$compile('<div ng-controller="myCtrl">'+html+'</div>')(validScope);

控制器已实例化。但是占位值没有绑定。

4

2 回答 2

1

我不知道你试图从哪里获得所有这些控制器的上下文,但我会假设你正在另一个控制器、服务或指令中枯萎。

下面的代码将展示如何从服务创建控制器。该示例可能涵盖的内容超出了您需要做的范围,但这是一种可行的模式。

创建一个抽象控制器,这将设置控制器的构造函数参数并隔离其余的依赖项。

module.factory('AbstractCtrl', ['dependencies...', function (dependencies...) {
    var ctrl = function($scope) {
           // Do controller setup.
    };

    return ctrl;
}]);

现在基于抽象创建一个控制器实现

module.controller('CtrlImpl', ['$scope', 'AbstractCtrl', function ($scope, AbstractCtrl) {
    // Initialize the parent controller and extend it.
    var AbstractCtrlInstance = new AbstractCtrl($scope);
    $.extend(this, AbstractCtrlInstance);
    // … Additional extensions to create a mixin.
}]);

现在您已经有了一个带有最小定义构造函数的控制器来创建控制器的实例,您只需要调用注入 $controller 并执行以下操作:

$controller('CtrlImpl', {$scope: $scope}));
于 2013-10-30T16:30:17.777 回答
1

我认为最好的方法是在范围上公开一个函数来检索你的控制器。(ngController可以接受一个字符串或一个函数)假设你有不同的值需要不同的构造函数......大致是这样的:

<div ng-repeat="item in items">
  <div ng-controller="controllerFor(item)">
    // whatever
  </div>
</div>

controllerFor函数将知道如何为您进行映射。希望您可以避免$compile一起使用。

于 2013-10-28T01:16:19.857 回答