2016-11-25 17 views
0

私はいくつかのビューがありますが、コントローラーは1つしかないWebページを作成します。コントローラがページスイッチにリロードしないように、私はすべてのルートを "/ main/{{itemNo}} /?routname"に変更しました。しかし、ページを切り替えるときには、コントローラはまだリロードされています(英語が選択されていても、言語は常にドイツ語に戻されます)。誰か私が間違っていることを教えてもらえますか?ここでreloadOnSearchがfalseに設定されていても、コントローラーがリロードされます。

は、私のコードの一部です:

これは新しいルートとapp.jsの一部です:

.config(function ($routeProvider) { 
    $routeProvider 
     .when('/main', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl', 
     controllerAs: 'main' 
     }) 
     .when('/main/1/cart', { 
     templateUrl: 'views/cart.html', 
     controller: 'MainCtrl', 
     controllerAs: 'main', 
     reloadOnSearch: false 
     }) 
     .when('/main/2/personaldata', { 
     templateUrl: 'views/personalData.html', 
     controller: 'MainCtrl', 
     controllerAs: 'main', 
     reloadOnSearch: false 
     }) 

これは私のコントローラです:

.controller('MainCtrl', function ($scope) { 
    this.awesomeThings = [ 
     'HTML5 Boilerplate', 
     'AngularJS', 
     'Karma' 
    ]; 
    // console.log('init'); 




    $('#german').click(function() { 
     changeValue('german'); 
    }); 

    $('#english').click(function() { 
     changeValue('english'); 
    }); 

    $('#toshoppingcart').click(function() { 
     setTimeout(function() { 
     changeValue(selectedLang); 
     }, 10); 
    }); 

    $('#tocheckout').click(function() { 
     setTimeout(function() { 
     changeValue(selectedLang); 
     }, 10); 
    }); 



    var loadScript = function (src, callbackfn) { 
     var newScript = document.createElement("script"); 
     newScript.type = "text/javascript"; 
     newScript.setAttribute("async", "true"); 
     newScript.setAttribute("src", src); 

     if (newScript.readyState) { 
     newScript.onreadystatechange = function() { 
      if (/loaded|complete/.test(newScript.readyState)) callbackfn(); 
     } 
     } else { 
     newScript.addEventListener("load", callbackfn, false); 
     } 

     document.documentElement.firstChild.appendChild(newScript); 
    }; 


    function changeValue(language) { 
     console.log('change', language) 
     selectedLang = language; 
     if (language == 'english') { 
     loadScript("scripts/languages/english.js", function() { 
      updateValues() 
     }); 
     } else { 
     loadScript("scripts/languages/german.js", function() { 
      updateValues() 
     }); 
     } 
    } 

    var selectedLang = 'german'; 
    changeValue(selectedLang); 
+0

サイドノート、あなたはNG 'jQueryのIDセレクタを使用して代わりにしているいずれかの理由-click'? –

+0

これは通常のjsプロジェクトで、fwがなくても直前にリロードの問題があったので角度を変えました – threxx

+0

'selectedLang'はコントローラのコンストラクタスコープではなく別の場所に格納する必要があります。おそらく' $なぜなら、コントローラが呼び出されるたびに(あなたが使用するすべてのルート)、 'selectedLang'変数は、前に定義された値の代わりに' german'として定義されるからです。私は正しい? –

答えて

1

問題がありますreloadOnSearch = falseは、パラメータ(別名、検索)またはハッシュ?q=blablabal#/my-route#myHashの変更時にルートがリロードされないようにします。これを再現する代わりに$routeUpdate$rootScopeにトリガーされます。あなたのケースでは、あなたはどちらかを使用していない、あなたは全体のルートを変更しているので、それはルートをリロードします。 $routeProviderのためのドキュメントによると

[reloadOnSearch=true] - {boolean=} - のみ$location.search()または$location.hash()変更ルートをリロードします。

このオプションをfalseに設定し、ブラウザのurlを変更すると、$routeUpdateイベントがルートスコープでブロードキャストされます。

コントローラが呼び出されるたびに(あなたがそれを使用するすべてのルートが)あなたのselectedLang変数が定義されているためまた、あなたは、おそらく$rootScopeまたはlocalstorageに、別の場所ではなく、コントローラのコンストラクタスコープでselectedLangを格納する必要があり以前に定義された値の代わりに'german'となります。

(もちろん、これを行うの角道を使用することを検討して、これは単なる一例である)このようなものを試してみてください:

function changeValue(language) { 
    console.log('change', language) 
    selectedLang = window.localStorage['language'] = language; 
    if (language == 'english') { 
    loadScript("scripts/languages/english.js", function() { 
     updateValues() 
    }); 
    } else { 
    loadScript("scripts/languages/german.js", function() { 
     updateValues() 
    }); 
    } 
} 

var selectedLang = window.localStorage['language'] || 'german'; 
changeValue(selectedLang); 
関連する問題