2015-11-08 40 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( '數據存儲',函數(){

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希望有幫助, 祝你好運。

+0

我喜歡這種方法。它仍然讓我爲所有不同的變量重新輸入相同的代碼,但是組織如你所描述的那樣更加乾淨。 – zeeshan