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

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 do那样做。

UPD。我已经尝试过这种方式:

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


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

最佳答案

我不知道您尝试从中使用所有此控制器的上下文,但我将假定您在另一个控制器,服务或指令中处于枯萎状态。

下面的代码将显示如何从服务创建控制器。
该示例可能涵盖了您不需要做的所有事情,但这是一个行之有效的模式。

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

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.
}]);


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

$controller('CtrlImpl', {$scope: $scope}));

10-07 19:53
查看更多