2015-07-21 74 views
1

我一直在旋转这几天没有运气。除此之外,我有BaseControllerinit方法。然后,我希望扩展这个控制器,并且从孩子的init方法中调用父母的init方法。从扩展控制器角度调用父方法

一般的答案是致电$scope.$parent.init($settings_object)。但是,这是返回Error: $scope.$parent.init is not a function

通常扩展控制器工作正常,能够访问perents功能和设置没有问题。只是这个例子调用孩子的同一父方法失败。

BaseController

(function(){ 
 
\t var mainApp = angular.module("MyAppModule");  
 
\t mainApp.controller('BaseController',function($scope, $rootScope,GLOBAL_CONFIG, ajaxRESTful,sharedValues, messageDisplay) { //base contorller 
 
    \t var bvm = this; //base vm 
 

 
    \t this.init = function($settings_object){ 
 
    \t \t var keys = Object.keys($settings_object); 
 
    \t \t for(i=0;i<keys.length;i++){ 
 
    \t \t \t bvm[keys[i]] = $settings_object[keys[i]]; 
 
    \t \t \t 
 
    \t \t } 
 
    \t } 
 
    \t 
 
      //code remved to keep simple 
 
    \t 
 
\t }); 
 
})();

扩展控制器

(function(){ 
 
var app = angular.module('MyAppModule'); 
 
\t app.controller('RoleEdit', function($scope, $rootScope,$controller) { 
 
\t \t angular.merge(this, $controller('BaseController', {$scope: $scope})); 
 
\t \t var vm = this; 
 
\t \t vm.newRoleFormData = []; 
 
\t \t vm.role_id = null; 
 
\t \t vm.mode = 'create'; 
 
\t \t vm.role = null; 
 
\t \t \t \t \t \t 
 
\t \t vm.init = function ($object) { 
 
\t \t \t console.log(vm); 
 
\t \t \t console.log($scope.$parent); 
 
\t \t \t $scope.$parent.init($object); 
 
\t    if(vm.role_id != null){ 
 
\t    vm.loadInRole(); 
 
\t    } 
 
\t  }; 
 
\t \t 
 

 
\t \t 
 
\t }) //end contoller 
 

 
})();//end of app

为什么不这项工作? 有没有更好的方法来做到这一点?

+1

初始化不在范围之内。将其更改为范围。它会工作。 $ scope.init = .. – manivannan

+2

考虑可能是一个控制器之间通话的服务。最佳实践。你也可以通过$ rootScope进行交谈,这不是最好的方式。 –

+1

忘记$ parent甚至存在于角度中。这是非常非常罕见的,你需要使用它,因为通常有更好的方法。使用服务将控制器连接在一起 – charlietfl

回答

4

控制器对象(this)和$scope对象没有直接关系。它们之间没有自动布线。 $scope.$parent不返回控制器,它返回父范围。而且,由于您在this.init中注册了父级方法,而不是通常的$scope.init,所以不能指望使用范围来查找它。

您可以通过很多方式绕过这一点,但正如其他人所建议的,如果您拥有许多控制器共享的功能,请尝试将其放入服务中。也许你的BaseContoller本身应该是一项服务。

0

你应该这样做:

var parentInit = this.init.bind(this); 
this.init = function ($object) { 
    parentInit($object); 
    if(vm.role_id != null){ 
    vm.loadInRole(); 
    } 
}