Подтвердить что ты не робот

AngularJS - Директивы против контроллеров

Я пытаюсь создать свое первое приложение, используя AngularJS. Тем не менее, я немного смущен, если мне нужно использовать директивы для моего конкретного случая.

У меня есть простая страница карты, где мне нужно показать значение lat/lon выбранного региона. На данный момент я вообще не использую директивы. Я делаю все в контроллере и использую частичные для отображения результатов. Я не планирую повторно использовать свой вид карты в любом другом месте. Вот почему я не чувствовал, что мне нужна директива.

С другой стороны, я где-то читал, что каждый раз, когда вы пытаетесь манипулировать DOM в своем контроллере (что я делаю с помощью API карт google), вы должны перенести эту часть на директивы.

Здесь мой простой контроллер:

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>
4b9b3361

Ответ 1

Вот краткий автономный ответ со ссылками на официальные документы для дальнейшей информации (определение "сервисы" добавлено для хорошей оценки):

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

В Angular контроллер - это функция конструктора JavaScript, которая используется для расширения области Angular.

Когда контроллер подключен к DOM с помощью директивы ng-controller, Angular будет создавать экземпляр нового объекта контроллера, используя указанную функцию конструктора контроллера. Новая дочерняя область будет доступна в качестве параметра для инъекции функции конструктора контроллера как $scope.

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

На высоком уровне директивы - это маркеры в элементе DOM (такие как атрибут, имя элемента или класс CSS), которые сообщают компилятору HTML(), чтобы связать указанное поведение к этому элементу DOM или даже к преобразованию элемента DOM и его дочерних элементов.

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

Angular службы являются заменяемыми объектами, которые соединены вместе с использованием инъекции зависимостей (DI). Вы можете использовать службы для организации и совместного использования кода в своем приложении.

Ответ 2

Я думаю, вы должны использовать контроллеры для подключения служб, зависимостей и обработки бизнес-логики.

Директивы должны использоваться для манипуляций с DOM, поэтому он отлично подходит для обработки пользовательских взаимодействий, например. добавлять/редактировать виджет. Было бы анти-шаблоном, чтобы добавить это к контроллеру, поскольку это не является проблемой контроллера, и он будет раздуваться другими функциями, поэтому достаточно легко передать значения (область) из вашего контроллера в директиву, если это необходимо.

Затем вы получаете преимущество, заключающееся в том, что вы можете добавить директиву виджета в другие места вашего приложения, если это необходимо, и, как правило, упрощает использование базы кода в качестве следующего закона Деметры

Зная, когда и где разделить функциональность, это одна из самых сложных вещей для меня о Angular, вы будете делать ошибки, но с практикой становится легче.

Чтобы ответить на вопрос, вы, вероятно, должны разделить его на директивы, но это также вопрос сложности. Если ваше приложение прост, как вы сказали, вы можете найти то, что у вас будет, все в порядке. Он может просто стать рефакторингом при изменении требования.

Ответ 3

Мои сверстники и я столкнулись с подобной ситуацией, изучая AngularJS. Я собрал эту простую таблицу, которая должна дать всем хорошую отправную точку в зависимости от того, какую функциональность они пытаются реализовать в Angular. http://demisx.github.io/angularjs/2014/09/14/angular-what-goes-where.html