#3 Пишем Trello на AngularJS. Часть 3.

poster
В этом уроке мы продолжаем реализовывать Trello, а именно отображение и создание карточек.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

Всем привет. Мы продолжаем делать Trello, а именно, работать с карточками. Давайте для начала создадим новую фабрику, которая будет называться cardFactory. В ней будет идти взаимодействие с карточками.

angular.module('app').factory('cardFactory', function () {
  var service = {};

  var cards = [
    {
      id: 1,
      description: 'Fix bug in player',
      list_id: 1
    },
    {
      id: 2,
      description: 'Add feature with D3',
      list_id: 2
    },
    {
      id: 3,
      description: 'Learn AngularJS',
      list_id: 3
    }
  ];

  return service;
});

Service - это обьект с методами фабрики. cards - приватный массив в карточками, которые у нас уже есть. list_id - это id списка, к которому привязана карточка. Для того, чтобы понимать, к какому списку относится карточка, мы вводим понятие list_id. Теперь мы легко можем из нашего массива карточек вытащить карточки, у которых list_id = 1.

Теперь нам понадобится какой-то метод, который будет возвращать все карточки по выбраному списку.

service.getCards = function (list) {
  return _.filter(cards, { list_id: list.id });
}

getCards на вход принимает list. С помощью метода filter, мы выбираем все карточки списка.

Теперь давайте добавим ng-repeat, который будет выводить карточки.

<section id="lists-container"
         class="lists-container"
         ng-controller="listsCtrl as listsCtrl">
  <div class="row">
    <section class="list list-inline"
             ng-repeat="list in listsCtrl.lists">
      <h1>{{list.listName}}</h1>

      <div class="card"
           ng-repeat="card in listCtrl.getCards(list)">
        {{card.description}}
      </div>

      <a ng-click="listsCtrl" class="hand">
        <div class="remove remove-list"></div>
      </a>
    </section>

    <section class="list new-list list-inline">
      <form ng-submit="listsCtrl.addList()">
        <input type="text" ng-model="listsCtrl.listName"/>
      </form>
    </section>
  </div>
</section>

getCards - это метод, который вынимает карточки списка, поэтому логично, чтобы он относился к контроллеру списка. На вход мы передаем ему list.

В listCtrl добавим метод getCards, где вызовем getCards из фабрики.

angular.module('app').controller('listCtrl', function (listFactory, cardFactory) {
  this.removeList = function (list) {
    listFactory.removeList(list);
  }

  this.getCards = function (list) {
    return cardFactory.getCards(list);
  }
});

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

Также нужно не забыть подключить cardFactory в наш index.html.

Как мы видим, у нас вывелись карточки и у нас в каждом списке вывелось по карточке.

Теперь добавим возможность добавления собственной карточки.

<section id="lists-container"
         class="lists-container"
         ng-controller="listsCtrl as listsCtrl">
  <div class="row">
    <section class="list list-inline"
             ng-repeat="list in listsCtrl.lists">
      <h1>{{list.listName}}</h1>

      <div class="card"
           ng-repeat="card in listCtrl.getCards(list)">
        {{card.description}}
      </div>

      <a ng-click="listsCtrl" class="hand">
        <div class="remove remove-list"></div>
      </a>

      <section class="new-card">
        <form ng-submit="listCtrl.createCard(list)">
          <input type="text"
                 ng-model="listCtrl.cardDescription"
                 class="card-input"
                 placeholder="New card">
        </form>
      </section>
    </section>

    <section class="list new-list list-inline">
      <form ng-submit="listsCtrl.addList()">
        <input type="text" ng-model="listsCtrl.listName"/>
      </form>
    </section>
  </div>
</section>

в метод createCard мы передаем list, который мы хотим создать.

Давайте добавим метод createCard в наш listFactory.

this.createCard = function (list) {
  cardFactory.createCard(list, this.cardDescription);
}

В метод createCard мы будем передавать список в который мы хотим добавить карточку и cardDescription.

Теперь давайте добавим этот метод в cardFactory.

service.createCard = function (list, cardDescription) {
  cards.push({
    id: _.uniqueId('card_'),
    description: cardDescription,
    list_id: list.id
  });
};

В наш массив cards мы пушим новый обьект.

В браузере мы видим, что карточка у нас добавляется, но поле input не очистилось. Добавим в createCard очистку.

this.createCard = function (list) {
  cardFactory.createCard(list, this.cardDescription);
  this.cardDescription = '';
}

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

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
Zato Prosto
4 месяцев назад
Спасибо за урок. Пара вопросов. Что можно\нужно инжектить в контроллер кроме factory? Любой скрипт, json-объект? Зачем логику метода выносить в factory? Разве контроллер не пригоден для этого? В чум суть-разница между контроллером и фабрикой с точки зрения архитектуры проекта, а также доступного функционала этих сущностей.
monsterlessons
4 месяцев назад
Можно инджектить фабрику, сервис, провайдер, константу. Бизнес логика выносится в factory для разделения ответственности. В контроллере должна быть только view логика. В этом и разница - контроллер это view слой, а фабрика это слой бизнес логики.
Zato Prosto
4 месяцев назад
Сервис и провайдер - это тоже слой бизнес логики?
monsterlessons
4 месяцев назад
Сервис да. Провайдер это более низкоуровневая штука на котором строятся сервис и фабрика