2017-06-13 71 views
0

我想從我的控制器訪問一個變量,所以我可以在我的服務中使用它!我認爲,如果我製作了全球變量,我可以在我的服務中訪問它,但它不是嘿嘿。變數是店鋪 btw!從控制器訪問變量以服務| Angular 1.5

這裏是我創建的變量:

$scope.$on('$ionicView.enter', function (e) { 
    ecommercer.getData().then(function (s) { 
     $scope.shops = s.vendors 
     $scope.categories = s.categories 

     $ionicScrollDelegate.resize() 

     if ($stateParams.id && $stateParams.id.length > 1) { 
      $ionicTabsDelegate.showBar(false) 
      ecommercer.saveShopById($stateParams.id) 
      $state.go('tab.ecommerce.shop') 
     } 
    }) 
}) 

這裏(同一個文件),我用我的變量:

$scope.$watch('selectedCategory.name', function (newval, oldval) { 

     if ($scope.selectedCategory.name != undefined) { 
      $scope.shops = ecommercer.filterByCategory(newval.id) 

     } else { 
      $scope.shops = ecommercer.filterByCategory(null) 
     } 

    }) 

這裏就是我創建相同的可變在我的服務文件:

app.service('ecommercer', function (eapi, $q, storage, $http, endpointHandler, $state, $rootScope, $filter) { 
var products, categories, vendors, shops 

最後,這裏是當我想在我的服務來使用它:

function filterByCategory(categoryid, shops) { 
    if (!categoryid) return shops 
    console.log(shops); 

    var newlist = [] 
    for (var s in shops) { 
     if (shops[s].category.split(',').length > 0) { 
      for (var c in shops[s].category.split(',')) { 
       if (shops[s].category.split(',')[c] == categoryid) { 
        newlist.push(shops[s]) 
       } 
      } 
     } 
    } 
    return newlist 
} 

回答

1

你的控制器實際上是你的看法和辛格爾頓服務之間只是膠水......他們(重新)創建,並在整個應用程序生命週期detroyed - 創建一次服務(單身 - 和注射時創建後重復使用) 。

爲此,您應該轉向您的方法,而不是保留要在控制器內部的應用程序(控制器/服務)上共享的變量 - 在$scope對象上 - 您應該在單件服務ecommercer內創建它。

通過getter/setter原理,您可以更新/檢索您的單件服務ecommercer中的變量shops

請參閱以下粗略示例來說明如何更改方法。

控制器&服務

angular 
    .module('app', []) 
    .controller('MainController', MainController) 
    .service('ecommercer', ecommercer) 

function ecommercer() { 
    var shops; 

    return { 
    setShops: setShops, 
    getShops: getShops 
    } 

    function setShops(shops) { 
    this.shops = shops; 
    } 

    function getShops(shops) { 
    return this.shops; 
    } 

} 


function MainController(ecommercer) { 
    var vm = this; 
    this.setShops = setShops; 

    function setShops() { 
    ecommercer.setShops([{ 
     id: 1, 
     name: 'test shop 1' 
    }, { 
     id: 2, 
     name: 'test shop 2' 
    }]); 
    vm.shops = ecommercer.getShops(); 
    } 

} 

VIEW

<div ng-app="app" ng-controller="MainController as vm"> 
    <div ng-click="vm.setShops()"> 
    Set shops 
    </div> 
    <div> 
    {{vm.shops}} 
    </div> 
</div> 

https://jsfiddle.net/DaanDeSmedt/j5uqaxgy/