2016-11-25 85 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); 
相关问题