0

Ich möchte wissen, ob es eine Möglichkeit einen $stateParams Parameter nach einer Änderung bei einem angular material switch

<section id="app_controls"> 
    <span style="margin-right: 10px;">Ro</span> 
    <md-switch class="md-primary" 
       ng-model = "data.lang" 
       aria-label="Switch language" 
       ng-true-value="'en'" 
       ng-false-value="'ro'" 
       ng-change="setLang(data.lang)" 
    >En</md-switch> 
    <span id="exit"></span> 
</div> 
</section> 

Steuerung der Aktualisierung

.controller('homeController', ['$stateParams','$state', '$scope', 'PageProperties', 'loadMyData', 
      function($stateParams, $state, $scope, PageProperties, loadMyData){  


    //set page elements 
    var properties = PageProperties.setProps("home", loadMyData); 
    $scope.props = properties; 
    $scope.lang; 

    $scope.setLang = function(lang) {   
     $scope.message = lang; 
     }; 
}]) 

route.js

.state('home', { 
      url: '/home?lang', 
      params: { lang: 'ro'}, 
      templateUrl: 'views/home/home.html', 
      controller: 'homeController',//'homeController' 
      resolve:{ 
        //loadResources e doar o denumire, nu vreun key-word 
         loadResources: ['$ocLazyLoad', function($ocLazyLoad) { 
          // you can lazy load files for an existing module 
          //conteaza ordinea in care le scriu 
           return $ocLazyLoad.load(['pageNavPropsService', 'homeCtrl','homeDirective']); 
         }], 
         loadMyData: ['$stateParams', 'GetDataService', function($stateParams, GetDataService){ 
          //get innitial data for states 
          var path = '_global/views/services/json/' + $stateParams.lang + '_data.json'; 
          return GetDataService.getData(path); 
         }] 
      } 
     })  

Ich kann auf nichts anderes von der Steuerung außer $scope innerhalb von setLang() Funktion zugreifen.

Was ich versuche zu erreichen ist, einen Sprachschalter zu haben, der den Zustandsparameter lang aktualisiert - was ich hoffe, dass er für jeden anderen Zustand bei Zustandsänderung gleich bleibt. Ich möchte diesen Zustand auch neu laden, nachdem sich der Parameter geändert hat.

Wie kann ich das erreichen?

+0

Haben Sie einen besonderen Grund haben nicht die Sprache in rootScope zu speichern. Sie müssen die Statusparameter also nicht jedes Mal aktualisieren, wenn ein Benutzer eine Sprache ändert. Dies bedeutet auch, dass Sie den Verwaltungsaufwand für Ihre Sprachvariable in Ihrem Router reduzieren. – ankitjain11

+0

Ich glaube nicht - ich bin ein Neuling in eckigen, so dass ich dachte, dass es getan werden könnte - aber ich stecke jetzt fest. Wie kann es mit Ihrer Variante gemacht werden? – sTx

Antwort

0

Grundsätzlich können Sie die Sprache in $ rootScope referenzieren.

Ihren Code aktualisieren, es könnte wie folgt aussehen:

Controller

.controller('homeController', ['$stateParams','$state', '$scope', 'PageProperties', 'loadMyData', '$rootScope', 
      function($stateParams, $state, $scope, PageProperties, loadMyData, $rootScope){  


    //set page elements 
    var properties = PageProperties.setProps("home", loadMyData); 
    $scope.props = properties; 


    $scope.setLang = function(lang) {   
     $rootScope.lang = lang; 
     }; 
}]) 

route.js

.state('home', { 
    url: '/home?lang', 
    params: { lang: 'ro'}, 
    templateUrl: 'views/home/home.html', 
    controller: 'homeController',//'homeController' 
    resolve:{ 
      //loadResources e doar o denumire, nu vreun key-word 
       loadResources: ['$ocLazyLoad', function($ocLazyLoad) { 
        // you can lazy load files for an existing module 
        //conteaza ordinea in care le scriu 
         return $ocLazyLoad.load(['pageNavPropsService', 'homeCtrl','homeDirective']); 
       }], 
       loadMyData: ['$stateParams', '$rootScope', 'GetDataService', function($stateParams, $rootScope, GetDataService){ 
        //get innitial data for states 
        var path = '_global/views/services/json/' + $rootScope.lang + '_data.json'; 
        return GetDataService.getData(path); 
       }] 
    } 
}) 

, auch eine Standardsprache einstellen, in Ihrem app.run, können Sie Speichere den Standardwert für deine Sprache.

.factory('langService', function() { 
     var default_lang = "ro"; 
     var setLang = function(lang){ 
      if(!lang) 
       this.language = default_lang; 
      else 
       this.language = lang; 
      }; 
     var getLang = function(){ 
      if(!this.language) 
       return this.language = default_lang; 
      else 
       return this.language; 
     } 

     return { 
      setLang : setLang, 
      getLang: getLang 
     } 
    }) 

und in Zustand resolve

:

+0

Wenn ich rootSCope in Routen configs eintrage gibt mir diesen Fehler: ** angular-1.5.8.js: 68 Uncaught Fehler: [$ injector: modulerr] Fehler beim Instanziieren des Moduls NimbusApp aufgrund: Fehler: [$ injector: modulerr] Fehler beim Instanziieren von Modulrouten wegen: Fehler: [$ injector: unpr] Unbekannter Provider: $ rootScope ** – sTx

+0

Was ist der beste Weg, um eine Sprachoption für eine App zu handhaben, geben Sie an, dass ich die Sprache zum Abrufen von Daten brauche? – sTx

+0

Siehe auch: http://StackOverflow.com/a/28165656/2149883 – ankitjain11

0

Endlich habe ich es mit einem Dienst wie dies getan

resolve:{ 
    loadResources: ['$ocLazyLoad', function($ocLazyLoad) { 
           return $ocLazyLoad.load(['pageNavPropsService', 'gourmetCtrl' ,'customHeader', 'customFooter']); 
    }], 
    loadMyData: ['$stateParams', 'GetDataService', 'langService', function($stateParams, GetDataService, langService){ 
       var path = '_global/views/services/json/' + langService.getLang() + '_data.json'; 
       return GetDataService.getData(path); 
      }] 
    }