Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Функция добавления в сервисе (https://javascript.ru/forum/angular/60194-funkciya-dobavleniya-v-servise.html)

LCH 16.12.2015 14:27

Функция добавления в сервисе
 
Здравствуйте!

Учу Ангуляр и разрабатываю по ходу маленькое приложение.

Есть список элементов, они все в сервисе. так же в сервис хочу добавить функции по добавлению, удалению и т.д. элементов. А в контролере уже их просто вызывать. Удалять получается, а вот добавить нет, поэтому прошу помощи.

Код сервиса:
angular.module('items').factory('itemsFactory', function () {
    var items = {};
    items.list = [
        //список обьектов
    ];
    items.addItem = function(newItem) {
        items.list.push(newItem);
    }
   items.deleteItem = function(index){
            items.list.splice(index, 1);
    };
    return items;
});


Конроллер:
angular.module('main').controller('itemCtrl', function($scope, itemsFactory) {
$scope.items = itemsFactory.list;
$scope.deleteItem = function(index) {
        itemsFactory.deleteItem(index);
    };
$scope.addItem = function(index) {
        itemsFactory.addItem(index);
    };


HTML:
<form name="itemsForm" novalidate ng-controller="itemCtrl" ng-submit="addItem(newItem)">
<input ng-model="newItem.name" >
<input type="submit" value="+" >
</form>


Проблема в том, что после добавления поле инпута должно очищаться, чтобы можно было добавить еще элемент, но вот как не бьюсь - не могу это сделать :( Храню в отдельных файлах. Пробовал создавать переменную для newItem (обьект с пустыми параметрами), но вот после добавления, толи потому, что передаем аргумент в тело функции, то ли даже не знаю почему... никак не получается ее обнулить.

krasovsky 19.12.2015 12:34

Вероятно потому, что фабрика созданная .factory('myfactory') - это синглтон, простой объект который хранится в потрошках ангуляра и в отличие от контроллера не переинициализируется.

При этом ты хранишь все добавленые итемы в этой фабрике, а твой инпут хранит ссылку на этот итем в этой фабрике, и соответственно выводит его.

shur777 29.12.2015 20:08

LCH, скорее всего ты уже всё знаешь :), но если вопрос остался открыт:
$scope.addItem = function(index) {
 itemsFactory.addItem(index);
};
Передавай не объект (т.к. объект передается по ссылке), а копию объекта.
А затем, очищай модель привязанную к инпуту:
$scope.addItem = function(index) {
 itemsFactory.addItem(angular.copy(index));
 $scope.newItem.name = '';
};


Часовой пояс GMT +3, время: 01:38.