我有一个项目,其中许多模型将由几乎相同的控制器代码管理,唯一的例外是他们调用不同的服务。
我现在正在处理的方法是将具有公共代码的Crud-Controller实例化到每个自定义控制器中,然后通过更改自定义控制器内的变量来重定向服务调用。即
通过在自定义控制器中设置vm.service.get()
,Crud-Controller内的vm.service = teamService;
会发生变化。
这就是我现在将Crud-Controller实例化到我的自定义控制器中的方法:
$injector.invoke(Crud, this, {$scope:$scope});
这很好用,但我不知道这是否是分享通用控制器代码的正确方法。也许有可能为此用途实例化服务?因为我的问题(如果我的方式是正确的),如何在使用IIFE时访问其他控制器?现在我没有使用IIFE,因为我还没有想出办法。
我尝试使用angular.module('app').controller('Crud')
,但它不起作用。
即:如何在不使用$ injector或依赖$ scope继承的情况下访问PrimaryCtrl的编辑功能? http://jsfiddle.net/tcVhN/62/
答案 0 :(得分:0)
看起来您的示例使用支持开箱即用的全局控制器的Angular 1.0.x. That's how it would be done有更新的Angular,没有深入探讨JS继承的危险。
'use strict';
(function (root, angular) {
root.ctrls = root.ctrls || {};
var primaryCtrl = function ($scope) {
var self = this;
console.log('primaryCtrl constructor', self, $scope);
};
primaryCtrl.prototype = {
items: ['Item 1', 'Item 2'],
edit: function (item) {
//do stuff
}
};
primaryCtrl.$inject = ['$scope'];
root.ctrls.primaryCtrl = primaryCtrl;
})(this, angular);
(function (root, angular) {
root.ctrls = root.ctrls || {};
var secondaryCtrl = function ($scope) {
var self = this;
console.log('secondaryCtrl constructor', self, $scope);
};
secondaryCtrl.prototype = angular.extend({},
root.ctrls.primaryCtrl.prototype,
{
items: ['Stuff 1', 'Stuff 2']
}
);
secondaryCtrl.$inject = ['$scope'];
root.ctrls.secondaryCtrl = secondaryCtrl;
})(this, angular);
var app = angular.module('app',[]);
app.controller('PrimaryCtrl', ctrls.primaryCtrl);
app.controller('SecondaryCtrl', ctrls.secondaryCtrl);
和
<div ng-controller="PrimaryCtrl as primary">
<p ng-repeat="item in primary.items">{{item}}</p>
</div>
<div ng-controller="SecondaryCtrl as secondary">
<p ng-repeat="item in secondary.items">{{item}}</p>
</div>
您也可以查看Angular Classy,这会为Angular带来自以为是但可行extending syntax。