2017-06-13 46 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/