8

私はこのコードを持っています:

JS:

angular.module("module")
  .controller("fooController", ["$scope", function($scope) {
    ...
  })
  .directive("foo", function() {
    return {
      restrict: "E",
      controller: "fooController",
      link: function($scope, $element, $attrs) {
        // Do some things with the scope of the controller here
      }
    }
  })
  .directive("bar", function() {
    return {
      restrict: "E",
      require: "fooController",
      link: function($scope, $element, $attrs) {
         // Nothing yet
      }
    }
  });

HTML:

<html>
  <head>
    <!-- Scripts here -->
  </head>
  <body ng-app="module">
    <foo/>
    <bar/>
  </body>
</html>

ディレクティブfooは機能しますが、ディレクティブbarはエラーをスローします: No controller: fooController

現在の構造を維持しながらこれを修正するにはどうすればよいですか (コントローラーは HTML の内部ではなく、ディレクティブによって使用され、bar外部fooにあり、同じコントローラーを共有し、両方がスコープを変更しています)。ここでの議論を読みましたが、その方法がわかりませんでした。

4

2 に答える 2

5

最終的な目的はコントローラー間の通信であるため、複数のディレクティブで同じコントローラーを再利用する必要はありません (再利用によって通信が可能になるかどうかは疑問です)。とにかく、それを行う最善の方法は、サービスを使用することです。

記事コントローラーは別のコントローラーを呼び出すことができますか? で詳しく説明していますが、簡単に言うと、まずサービスを作成します。

app.factory('myService', function () {
    var data;
    return {
        getData: function () {
            return data
        },
        setData: function (newData) {
            data = newData;
        }
    };
});

その後、コントローラーでこのサービスを使用し、サービスの関数を使用setData()して各コントローラーと通信できます。getData()

于 2013-06-05T09:09:14.017 に答える
4

コントローラーを要求することはできません。現在のディレクティブの親の 1 つであるディレクティブを要求できます。

   <foo>
      <bar />
   </foo>

   // in foo
   controller: 'fooController'
   // in bar
   require: '^foo' // ^ means to search it up in the tree

ここで、bar は foo を要求することができ、foo のコントローラーを持ちます: http://jsfiddle.net/Zmetser/kHdVX/ この例では、fooController は一度初期化されます。

   <foo />
   <bar />

   // in foo
   controller: 'fooController'
   // in bar
   controller: 'fooController'

ここで、bar と foo には fooController のインスタンスがあります: http://jsfiddle.net/Zmetser/QypXn/

于 2013-06-05T09:03:00.643 に答える