2016-08-23 23 views
0

ある角度コンポーネントのコントローラ内から別のコンポーネントのコントローラに関数を呼び出そうとしています。私はthis答えを見つけましたが、コントローラは私が従ったチュートリアルで示されているものとは異なって定義されていますので、コンポーネントとテンプレートをどのように参照するのか混乱しています。ここで角度コントローラとコンポーネントを定義する

が、私は現在、公式の角度チュートリアルに基づいて私のコントローラのいずれかを定義する方法である

angular. 
    module('moduleName'). 
    component('firstComponent', { 
    templateUrl: 'url/to/template', 
    controller: function FirstController($scope) { 
     //I want to call a function in SecondController here 
    } 
    }); 

//in another component file 
angular. 
    module('moduleName'). 
    component('secondComponent', { 
    templateUrl: 'url/to/template', 
    controller: function SecondController($scope) { 
     //function here which will be called 
    } 
    }); 

は...私は例では、私は上記のリンクのようにそれら-構造を再言う

var app= angular.module("myApp",[]); 

app.controller('One', ['$scope', '$rootScope' 
    function($scope) { 
     $rootScope.$on("CallParentMethod", function(){ 
      $scope.parentmethod(); 
     }); 

     $scope.parentmethod = function() { 
      // task 
     } 
    } 
]); 

//in another file 
var app= angular.module("myApp",[]); 
app.controller('two', ['$scope', '$rootScope' 
    function($scope) { 
     $scope.childmethod = function() { 
      $rootScope.$emit("CallParentMethod", {}); 
     } 
    } 
]); 

それぞれのコントローラのコンポーネントとそれぞれのテンプレートをどのように参照する必要がありますか?上記の例のように書きましたが、何も起こりませんでした。私は何の誤りもなかったが、文字通り何も起こらなかった。ページには何も表示されませんでした。コンソールに書き込もうとしましたが、何も表示されませんでした。

+0

また、あなたのHTMLを追加することができますか? – Aravind

+0

この時点では実際にはHTMLはありません。私は、コンソールロギングと一緒にテストするアラート機能を追加しました。コンソールログを使用したとき(「再構成」前)、メッセージが表示されました。再構成を試みた後、何も起こらなかった。私はちょうどコントローラがお互いに "話す"ようにしようとしている...またはそのことについては、それ自体で – user1852176

答えて

1

コードの2番目のブロックは正しいコンセプトを持っていますが、両方のコントローラーを動作させるためには両方のコントローラーをインスタンス化する必要があります。

ここにJSFiddleがあります。 https://jsfiddle.net/reid_horton/rctx6o1g/

ボタンをクリックすると、その下にテキストHello from callerComponent!が表示されます。

HTML

<div ng-app="myApp"> 
    <caller-component></caller-component> 
    <callee-component><</callee-component> 
</div> 

JS

var app = angular.module("myApp", []); 

app.component("callerComponent", { 
    template: "<button ng-click='externalCall()'>Click Me!</button>", 
    controller: function ($scope, $rootScope) { 
     $scope.externalCall = function() { 
      $rootScope.$emit("setText"); 
     } 
    } 
}); 

app.component("calleeComponent", { 
    template: "<p>{{ myText }}</p>", 
    controller: function ($scope, $rootScope) { 
     $rootScope.$on("setText", function() { 
      $scope.myText = "Hello from callerComponent!" 
     }); 
    } 
}); 
+0

ありがとう、これは働いた。私がちょっと混乱しているのは、コントローラーの命名だけです。明示的に宣言されていないので、Angularはコントローラーの名前がそのコンポーネントと同じであると仮定しますか? – user1852176

+0

コントローラの機能自体は匿名であるため、名前はありません。コンポーネントのテンプレートからコントローラにアクセスする必要がある場合は、 'controllerAs'属性を使用できます。詳細はこちら - https://docs.angularjs.org/api/ng/service/$compile#-controlleras- –

関連する問題