Angular从扩展控制器调用父方法

时间:2015-07-21 11:38:53

标签: javascript angularjs angularjs-scope

我一直在旋转这几天没有运气。除了其他方面,我还有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

为什么这不起作用? 有更好的方法吗?

2 个答案:

答案 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( );
  }
}