2015-07-21 101 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(); 
    } 
}