2014-10-03 20 views
1

我需要從每個控制器的firebase中獲取一組products,如果我不必每次都進行API調用,那將是理想選擇。用angularfire庫實現這個最好的方法是什麼?在angularjs應用程序中將重複調用放到firebase的位置?

https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray

現在我有(在CoffeeScript中):

app = angular.module 'EApp', ['ui.router', 'firebase'] 

app.config ($stateProvider, $urlRouterProvider) -> 

    $stateProvider 
    .state 'catalog', 
     url: '/catalog' 
     templateUrl: 'partials/catalog.html' 
     controller: 'catalogCtrl' 
    .state 'product', 
     url: '/product/:id' 
     templateUrl: 'partials/product.html' 
     controller: 'productCtrl' 

    $urlRouterProvider.otherwise 'catalog' 
    return 

app.controller 'catalogCtrl', ($scope, $rootScope, $firebase) -> 
    ref = new Firebase("https://my-url.firebaseIO.com/") 
    $scope.products = $firebase(ref).$asArray() 
    return 

app.controller 'productCtrl', ($scope, $rootScope, $stateParams, $firebase) -> 
    ref = new Firebase("https://my-url.firebaseIO.com/") 
    $scope.products = $firebase(ref).$asArray() 
    return 

有沒有辦法在2個控制器以分解出公共代碼,並在$rootScope(或類似)級別設置products一旦產品退回,我可以在productCtrl中做_.find

+2

撥打服務,並在該服務中有你的數據變量開始爲空。在第一次firebase調用中,設置你的數據變量,並在每次後續調用時檢查null,如果爲null,則再次從firebase中檢索,否則使用存儲的內容。 – tymeJV 2014-10-03 00:57:51

回答

1

正如@tymeJV說,在他的評論中,我確實設置爲陣列服務:

app.constant('FBURL', "https://my-url.firebaseio.com/"); 
app.factory('products', function($firebase, FBURL) { 
    var ref = new Firebase(FBURL); 
    var products = $firebase(ref).$asArray(); 
    return products; 
} 

,然後簡單地注入到這一點你的控制器,而不是(或除了)$firebase

app.controller 'catalogCtrl', ($scope, products) -> 
    $scope.products = products 
    return 

my trenches app我用這種方法來建立這個簡單的服務包$firebaseSimpleLogin

app.factory('$firebaseAuth', function($firebase, $firebaseSimpleLogin, FBURL) { 
    var auth = $firebaseSimpleLogin(new Firebase(FBURL)); 
    return auth; 
}); 

和稍微麻煩一些服務,它依賴於當前URL /路(下面簡單的代碼片段,「滿」的代碼在GitHub上):

app.factory('board', function($firebase, $firebaseAuth, FBURL, $routeParams) { 
    var ref = new Firebase(FBURL+"boards/"+$routeParams.boardId);  
    var cards = $firebase(ref.child('cards')).$asArray();  
    return { 
     ref: ref, 
     id: $routeParams.boardId, 
     cards: cards, 
    } 
}); 
+0

謝謝你的詳細回覆。我將如何去尋找陣列中的「產品」?我遇到了這樣的問題,即當我嘗試「_.find」它時,數組還沒有返回。在上述流程中,我應該怎樣做? – tyler 2014-10-03 22:11:07

+0

閱讀AngularFire返回的承諾。在這種情況下'products。$ loaded()。then(function(products){_.find(...'(https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire -firebaseobject-loaded)。但是Angular-wise我會更早地期望你通過它的id綁定你正在尋找的對象到'$ scope'。請注意,這些都不存在於你原來的問題中。 – 2014-10-03 23:39:48

+0

My原來的問題是關於如何做'_.find'。對不起,如果不清楚的話,我會在明天嘗試這個,如果它有效的話,獎勵你的解決方案。 – tyler 2014-10-04 00:04:48

相關問題