我一直在旋转这几天没有运气。除了其他方面,我还有BaseController
init
方法。然后我希望扩展这个控制器并从childs'init'方法中调用父'init'方法。
对此的一般答案是致电$scope.$parent.init($settings_object)
。但是这将返回Error: $scope.$parent.init is not a function
。
通常,扩展控制器能够正常访问perents功能和设置而没有问题。只是这个例子从子节点调用相同的父方法失败。
BaseController
(function( ){
var mainApp = angular.module("MyAppModule");
mainApp.controller('BaseController',function($scope, $rootScope,GLOBAL_CONFIG, ajaxRESTful,sharedValues, messageDisplay) { //base contorller
var bvm = this; //base vm
this.init = function($settings_object){
var keys = Object.keys($settings_object);
for(i=0;i<keys.length;i++){
bvm[keys[i]] = $settings_object[keys[i]];
}
}
//code remved to keep simple
});
})();
扩展控制器
(function( ){
var app = angular.module('MyAppModule');
app.controller('RoleEdit', function($scope, $rootScope,$controller) {
angular.merge(this, $controller('BaseController', {$scope: $scope}));
var vm = this;
vm.newRoleFormData = [];
vm.role_id = null;
vm.mode = 'create';
vm.role = null;
vm.init = function ($object) {
console.log(vm);
console.log($scope.$parent);
$scope.$parent.init($object);
if(vm.role_id != null){
vm.loadInRole( );
}
};
}) //end contoller
})();//end of app
为什么这不起作用? 有更好的方法吗?
答案 0 :(得分:4)
控制器对象(this
)和$scope
对象不直接相关。它们之间没有自动接线。 $scope.$parent
没有返回控制器,它返回父范围。由于您在this.init
而不是通常的$scope.init
中注册了您的父方法,因此您无法使用范围找到它。
您可以通过多种方式规避这一点,但正如其他人所建议的那样,如果您拥有许多控制器共享的功能,请尝试将其置于服务中。也许你的BaseContoller
本身应该是一种服务。
答案 1 :(得分:0)
你应该这样做:
var parentInit = this.init.bind(this);
this.init = function ($object) {
parentInit($object);
if(vm.role_id != null){
vm.loadInRole( );
}
}