2013-10-02 4 views
1

Я реализую свой первый контроллер AngularJS в тестовом приложении, и у меня возникают некоторые трудности.AngularJs: сомнения в реализации контроллера

У меня есть список элементов, которые я получаю от веб-службы RESTful, и я пытаюсь реализовать базовую логику CRUD для этих элементов.

Список показан на itemsList.htm странице и конфигурации маршрутизации является:

app.config(function ($routeProvider) { 
    $routeProvider 
     .when('/items', 
      { 
       controller: 'ItemsController', 
       templateUrl: 'app/Partials/itemsList.htm' 
      }) 
     .when('/items/:itemID', 
      { 
       controller: 'ItemsController', 
       templateUrl: 'app/Partials/editItem.htm' 
      }) 
     .otherwise({ redirectTo: '/items' }); 
}); 

Тогда у меня есть мой ItemsController:

app.controller('ItemsController', function ($scope, $routeParams, $location, itemsService) { 
    $scope.status; 
    $scope.items; 

    getItems(); 

    function getItems() { 
     itemsService.getItems() 
      .success(function (items) { 
       $scope.items = items; 
      }) 
      .error(function (error) { 
       $scope.status = 'Unable to load items: ' + error.message; 
      }); 
    } 

    function getItem(ID) { 
     // ... 
    } 
} 

Теперь я хочу добавить к тому же контроллеру функцию, возвращает определенный элемент, передающий свой идентификатор, и заполняет страницу editItem.htm, но я не знаю, чтобы получить доступ к этому функционалу ...

Я имею в виду: как я могу сопоставить путь /items/:itemID к этой функции? Должен ли я реализовать его в другом контроллере и изменить конфигурацию маршрута?

УКАЗАНИЕ Обычно я реализую свои веб-приложения с использованием Java и Spring MVC, и обычно я использую один контроллер для каждого объекта в своем приложении (например: ItemsController, CustomersController и т. Д.). Правильно ли следовать этому правилу также с AngularJs или есть какая-то другая лучшая практика?

+0

вид $ scope. $ On ('$ routeChangeSuccess', function (scope, next, current) { var path = $ location.path(); }); – Whisher

ответ

1

То, как я бы это сделал, было бы реализовать ItemController, который обрабатывает только один элемент за раз. Опять же, это зависит от того, как структурирован html.

В любом случае вам необходимо получить идентификатор выбранного элемента, используя коллекцию $ routeParams.

В контроллере вы можете сделать

if($routeParams.itemID) { 
    //you got the id. call the getItem 
    getItem(itemID).success(function(item) { 
     $scope.item=data; 
    }); 
} 

Эта часть должна быть добавлена ​​в любой ItemsController, если вы используете один и тот же контроллер, или в случае, если вы создаете новый контроллер еще же проверка будет необходимо.

При использовании существующих ItemsController реализация должна быть как

if($routeParams.itemID) { 
     //same as above code 
} 
else { 
    getItems(); 
} 

, что означает, что вы не хотите, чтобы загрузить список в области для одного вида товара.

+0

Что вы имеете в виду: _ "реализовать ItemController, который обрабатывает только один элемент за раз" _? Итак, какой должен быть правильный способ реализовать мой контроллер? Извините, но я совершенно не знаком с AngularJS ... – davioooh

+0

ItemsController может использоваться для перечисления элементов, сортировки, фильтрации и т. Д. Для действий по одному элементу может быть ItemController, который может поддерживать действия отдельных элементов, такие как создание, редактирование , удалить, обновить и т. д. В настоящее время вы используете один и тот же контроллер для сценариев \ views. – Chandermani

+0

uh, ok ... Я не заметил различий между элементами/деталями ... :) Это немного странно для меня, в Spring MVC я обычно реализую контроллер для каждой сущности (т.е. ItemsController, CustomersController и т. Д.), , Но, хорошо ... Я буду следовать твоему предложению. Спасибо. – davioooh

Смежные вопросы