2017-02-08 10 views
0

コントローラ(ネストされたコントローラ)の内側に角度コントローラがあります。 親メソッド内のメソッドをオーバーライドして、子メソッドを呼び出すことができます。例えば 、例の下に、私はisShow方法は、第二コントローラ(InsideCtrl)であるISOKメソッドを呼び出したいで角度範囲のメソッドオーバーライド

var angularApp = angular.module('ManagerApp', []); 

angularApp.controller('MainCtrl', ['$scope', function ($scope) { 

    $scope.states = ["NY", "CA", "WA"]; 
    $scope.isShow=function() 
    { 
    return $scope.isOK(); 
    } 

    $scope.isOK=function() 
    { 
    return false; 
    } 

}]); 

angularApp.controller('InsideCtrl', ['$scope', function ($scope) { 
    var vm = this; 
    vm.states2 = ["NY", "CA", "WA"]; 

    $scope.isOK=function() 
    { 
    return true; 
    } 
}]); 

私はそれをどのように行うことができますか?

+2

それはあなたの親スコープは、子スコープについて知っているとき、悪い習慣です。使用しないでください。 – Antonio

+0

親スコープが子スコープを知っていたらどういう意味ですか?そして私はそれをどのように使うべきですか? –

+0

'InsideCtrl'の' isOK'の振る舞いが再利用可能( 'InsideCtrl'と' MainCtrl'の両方がそれを使用します)であれば、それをリファクタリングしてサービスに入れることができます。 –

答えて

0

親スコープが子スコープに依存していて、すべてのプロパティまたはメソッドを知っていると、デザインが悪いです。 私はこのようなソリューションを好むだろう(それが:)理想的ではありません):

var angularApp = angular.module('ManagerApp', []); 

angularApp.controller('MainCtrl', ['$scope', 'defaultStateService', function ($scope, defaultStateService) { 
    this.stateService = defaultStateService; 

    $scope.states = ["NY", "CA", "WA"]; 
    $scope.isShow=function(state) { 
     return stateService.isOK(state); 
    } 
}]); 

angularApp.controller('InsideCtrl', ['$scope', 'customStateService', function ($scope, customStateService) { 
    var vm = this; 
    vm.states2 = ["NY", "CA", "WA"]; 
    $scope.$parent.stateService = customStateService; 
}]); 

この場合、あなたは2つのサービス実装する場合ParentControllerChildControllerせずに動作します:isOK方法でdefaultStateServicecustomStateServiceを。

+0

しかし、私のコードでは、parentControllerもChildControllerなしで動作します。これにはisOKメソッドもあります...私は、childControllerに親のメソッドをオーバーライドするisOKメソッドを持たせたいだけです。それとも、これは正しい方法ではありませんか? –

+0

親コントローラが常に親を1つしか持たないため、子コントローラが親にアクセスする方が良いでしょう。それ以外の場合、parentControllerにはいくつかの子があります。あなたのコードは、あなたがまだ子によってオーバーライドしていないのでうまく動作します。私の英語のために申し訳ありません) – Antonio

0

この要件を満たすには、factoryまたはserviceを使用できます。これらは、複数のコントローラ間でメソッド、変数、または値を共​​有するために使用できます。

HTML &コントローラー

var angularApp = angular.module('ManagerApp', []); 
 

 
angularApp.controller('MainCtrl', ['$scope', 'fact', function ($scope, fact) { 
 

 
    $scope.states = ["NY", "CA", "WA"]; 
 
    $scope.isShow=function() 
 
    { 
 
     fact.isOK(); 
 
    } 
 

 
    $scope.isOK=function() 
 
    { 
 
    return false; 
 
    } 
 

 
}]); 
 

 
angularApp.factory('fact', function(){ 
 
    var obj = {}; 
 
obj.isOK = function(){ 
 
    alert("LOGIN"); 
 
    } 
 
return obj; 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="ManagerApp" ng-controller="MainCtrl"> 
 
<button ng-click="isShow()">Click me</button> 
 
    </div>

関連する問題