2016-11-25 78 views
0

我構建了一個網頁,其中有幾個視圖但只有一個控制器。由於控制器不應該重新加載頁面切換,我將所有路由改爲「/ 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

側面說明,任何原因,你正在使用jQuery ID選擇,而不是'NG - 點擊? –

+0

這是一個普通的js項目,沒有任何fw之前,現在我把它改爲angular,因爲我也有重載問題 – threxx

+0

您可能需要將'selectedLang'存儲在不同的位置,而不是控制器的構造函數作用域,可能是'$ rootScope',因爲每次控制器被調用時(每個使用它的路由),你的'selectedLang'變量被定義爲'german',而不是先前的定義值。我對嗎? –

回答

1

的問題是reloadOnSearch = false將改變參數(aka,搜索)或哈希像?q=blablabal#/my-route#myHash時,將阻止您的路線重新加載。 $rootScope將觸發$routeUpdate而不是正確編碼。在你的情況下,你沒有使用任何一個,你正在改變整個路線,因此它會重新加載路線。

根據該文檔爲$routeProvider

[reloadOnSearch=true] - {boolean=} - 重新加載路由時只$location.search()$location.hash()變化。

如果該選項設置爲false並且瀏覽器中的URL發生更改,則在根作用域上廣播$routeUpdate事件。

此外,您可以選擇存儲selectedLang在不同的位置,而不是控制器構造範圍,也許就$rootScopelocalstorage,因爲每次控制器被調用你的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); 
相關問題