46

AngularJS を使用して最初のアプリを作成しようとしています。ただし、特定のケースでディレクティブを使用する必要がある場合は、少し混乱します。

選択した地域の緯度/経度の値を表示する必要がある単純なマップ ページがあります。現時点では、ディレクティブはまったく使用していません。コントローラーですべてを行い、パーシャルを使用して結果を表示します。マップ ビューを他の場所で再利用する予定はありません。そのため、指示が必要になるとは感じませんでした。

一方、コントローラーでDOMを操作しようとするたびに(GoogleマップAPIを使用して行っています)、その部分をディレクティブに移動する必要があることをどこかで読みました。

これが私の単純なコントローラーです:

function MapViewController($scope) {
  $scope.zoom = 6;
  $scope.lat = 37;
  $scope.lon = -122;
  var mapOptions = {
    center: new google.maps.LatLng($scope.lat, $scope.lon),
    zoom: $scope.zoom,
    mapTypeId: google.maps.MapTypeId.HYBRID
  };
  $scope.map = new google.maps.Map(
      document.getElementById('map-canvas'), mapOptions);

  /*
   * Update zoom and other map attributes.
   */
  google.maps.event.addListener($scope.map, 'center_changed', function() {
    $scope.$apply(function () {
      $scope.zoom = $scope.map.getZoom();
      var center = $scope.map.getCenter();
      $scope.lat = center.lat();
      $scope.lon = center.lng();
      var bounds = $scope.map.getBounds();
      var northEast = bounds.getNorthEast();
      $scope.northEastLat = northEast.lat();
      $scope.northEastLon = northEast.lng();
      var southWest = bounds.getSouthWest();
      $scope.southWestLat = southWest.lat();
      $scope.southWestLon = southWest.lng();
    });
  });

  /*
   * Set zoom and other map attributes.
   */
  google.maps.event.addListener($scope.map, 'some event', function() {
    $scope.$apply(function () {
      ...
    });
  });

  /*
   * Add markers to map.
   */
  google.maps.event.addListener($scope.map, 'another event', function() {
    $scope.$apply(function () {
      ...
    });
  });

}

そして、ここに私のパーシャルがあります:

  <div id="map-controllers" class="span4">
    <form class="form-horizontal">
      <div class="control-group">
        <label class="control-label" for="inputNumber">Zoom:</label>
        <div class="controls">
          <input type="text" class="input-mini" placeholder="zoom" value="{{ zoom }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">Latitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Latitude" value="{{ lat }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">Longitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Longitude" value="{{ lon }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">North East Latitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Latitude" value="{{ northEastLat }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">North East Longitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Longitude" value="{{ northEastLon }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">South West Latitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Latitude" value="{{ southWestLat }}">
        </div>
      </div>
      <div class="control-group">
        <label class="control-label" for="inputNumber">South West Longitude:</label>
        <div class="controls">
          <input type="text" class="input-large" placeholder="Longitude" value="{{ southWestLon }}">
        </div>
      </div>
    </form>
  </div>
4

3 に答える 3

60

詳細については、公式ドキュメントへのリンクを含む簡単なスタンドアロンの回答を次に示します(「サービス」の定義が適切な測定のために追加されています)。

http://docs.angularjs.org/guide/controller

AngularJS では、コントローラーは AngularJS スコープを拡張するために使用される JavaScript コンストラクター関数です。

コントローラーがディレクティブを介して DOM にアタッチされるとng-controller、AngularJS は、指定されたコントローラーのコンストラクター関数を使用して、新しいコントローラー オブジェクトをインスタンス化します。新しい子スコープは、コントローラーのコンストラクター関数 as への注入可能なパラメーターとして使用できます$scope

http://docs.angularjs.org/guide/directive

高レベルでは、ディレクティブは DOM 要素 (属性、要素名、または CSS クラスなど) のマーカーであり、AngularJS の HTML コンパイラ ( $compile) に指定された動作をその DOM 要素に付加するか、DOM 要素とその要素を変換するように指示します。子供。

http://docs.angularjs.org/guide/services

AngularJSサービスは、依存性注入 (DI) を使用して相互に接続された置換可能なオブジェクトです。サービスを使用して、アプリ全体でコードを整理および共有できます。

于 2014-04-07T18:26:31.730 に答える
13

コントローラーは、サービス、依存関係、ビジネスロジックの処理にのみ使用する必要があると思います。

ディレクティブは DOM 操作に使用する必要があるため、ウィジェットの追加/編集などのユーザー操作の処理に最適です。それはコントローラーの問題ではなく、他の機能によって肥大化するため、コントローラーに追加するのはアンチパターンです。必要に応じて、コントローラーからディレクティブに値(スコープ)を渡すのは簡単です。

次に、必要に応じて add a widget ディレクティブをアプリの他の場所に配置できるという利点が得られ、一般に、次のデメテルの法則に従ってコード ベースを簡単に追跡できます。

いつ、どこで機能を分割するかを知ることは、Angular について私にとって最も難しいことの 1 つであり、間違いを犯しますが、練習すれば簡単になります。

質問に答えるには、おそらくそれをディレクティブに分割する必要がありますが、それは複雑さの問題でもあります。要件が変更されたときに、リファクタリングのケースになる可能性があります。

于 2014-08-27T09:34:33.400 に答える