如何从代码实例化自定义控制器并保留范围继承。换句话说,我想做这样的事情:
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);
控制器已实例化。但是,持有地位的价值并没有限制。
答案 0 :(得分:1)
我认为最好的方法是在检索控制器的范围上公开一个函数。 (ngController
可以带一个字符串或一个函数)让我们说你有不同的值需要不同的构造函数......这个含糊不清的东西:
<div ng-repeat="item in items">
<div ng-controller="controllerFor(item)">
// whatever
</div>
</div>
controllerFor
函数将知道如何为您进行映射。希望您可以避免一起使用$compile
。
答案 1 :(得分: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}));