2015-11-08 3 views
1

У меня есть фабрика AngularJS для некоторых распространенных локальных манипуляций с хранилищами. Это общий набор функций против разных переменных. Я строю его так, чтобы функции повторялись в зависимости от того, какую переменную нужно манипулировать. Наверное, не изящный способ сделать это настолько открытым для вариантов.Как повторно использовать функции на заводе AngularJS?

Завод выглядит следующим образом. Есть ли способ повторного использования функций в зависимости от переменной без так много раздувания кода?

angular.module('app.datastore', []) 

    .factory('DataStore', function() { 

    var venue = angular.fromJson(window.localStorage['venue'] || '[]'); 
    var prize = angular.fromJson(window.localStorage['prize'] || '[]'); 

    function persist_venue() { 
     window.localStorage['venue'] = angular.toJson(venue); 
    } 

    return { 

     list_venue: function() { 
     return venue; 
     }, 

     get_venue: function(venueId) { 
     for (var i=0; i<venue.length; i++) { 
      if (venue[i].id === venueId) { 
      return venue[i]; 
      } 
     } 
     return undefined; 
     }, 

     create_venue: function(venueItem) { 
     venue.push(venueItem); 
     persist_venue(); 
     }, 

     list_prize: function() { 
     return prize; 
     }, 

     get_prize: function(prizeId) { 
     for (var i=0; i<prize.length; i++) { 
      if (prize[i].id === prizeId) { 
      return prize[i]; 
      } 
     } 
     return undefined; 
     }, 

     create_prize: function(prizeItem) { 
     venue.push(prizeIem); 
     persist_prize(); 
     } 
    }; 

    }); 
+0

Ваш код после вашего первого возврата недоступен! –

+0

Да! Я поймал эту новичковую ошибку. Я отредактировал вопрос, чтобы спросить, как фактор/повторное использование кода лучше. – zeeshan

+0

У вас есть фабрика - теперь вы можете повторно использовать эту фабрику через свое угловое приложение, вводя его в разные контроллеры, где это необходимо. Или что еще вы хотите использовать повторно? – shershen

ответ

1

Мой подход, чтобы вернуться на заводе функцию, которая будет возвращать магазин типа (место, приз, ...)

angular.module('app.datastore', []) 
    .factory('DataStore', function() { 

    var getStoreFunction = function (storeName) { 
     var store = angular.fromJson(window.localStorage[storeName] || '[]'); 

     function persist() { 
      window.localStorage[storeName] = angular.toJson(store); 
     }; 

     return { 
      list: function() { 
       return store; 
      }, 

      getItem: function (id) { 
       return store.find(function (elem) { 
        return elem.id === id; 
       }); 
      }, 

      createItem: function (item) { 
       store.push(item); 
       persist(store); 
      } 
     } 
    }; 

    return { getStore : getStoreFunction }; 
}); 

вы можете создать неограниченное хранилище с помощью

var venueStore = DataStore.getStore('venue'); 
//use of your store 
venueStore.createItem({ 
    id : venueStore.list().length + 1, 
    name : 'myVenue' + venueStore.list().length + 1 
}); 
$scope.venues = venueStore.list(); 

вы можете создать завод по типу, если хотите, или использовать его прямо в своем контроллере, как в этом примере: https://jsfiddle.net/royto/cgxfmv4q/

+0

Спасибо, что я сделаю этот снимок, поскольку он действительно уменьшает дублирование кода. – zeeshan

1

я не знаю, если вашему знакомое с угловым стилем руководством Джона папина, но вы действительно должны смотреть это может помочь вам с большим количеством дизайнерских вопросов. https://github.com/johnpapa/angular-styleguide

в любом случае - я бы рекомендовал использовать этот подход -

angular.module ('app.datastore', [])

.factory ('DataStore', функция() {

var venue = angular.fromJson(window.localStorage['venue'] || '[]'); 
    var prize = angular.fromJson(window.localStorage['prize'] || '[]'); 

    return { 
     list_venue: list_venue, 
     persist_venue: persist_venue, 
     get_venue: get_venue, 
     create_venue: create_venue, 
     list_prize: list_prize, 
     get_prize: get_prize, 
     create_prize: create_prize 
    }; 

    function persist_venue() { 
     window.localStorage['venue'] = angular.toJson(venue); 
    } 

    function list_venue() { 
     return venue; 
    } 

    function get_venue(venueId) { 
     for (var i = 0; i < venue.length; i++) { 
      if (venue[i].id === venueId) { 
       return venue[i]; 
      } 
     } 
     return undefined; 
    } 

    function create_venue(venueItem) { 
     venue.push(venueItem); 
     persist_venue(); 
    } 

    function list_prize() { 
     return prize; 
    } 

    function get_prize(prizeId) { 
     for (var i = 0; i < prize.length; i++) { 
      if (prize[i].id === prizeId) { 
       return prize[i]; 
      } 
     } 
     return undefined; 
    } 

    function create_prize(prizeItem) { 
     venue.push(prizeIem); 
     persist_prize(); 
    } }); 

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

+0

Мне нравится этот подход. Он по-прежнему меня переименовывает один и тот же код для всех переменных, но организация намного чище, как вы описали. – zeeshan

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