【问题标题】:angular js - ng-view - ng-route - condition when loading a viewangular js - ng-view - ng-route - 加载视图时的条件
【发布时间】:2016-12-20 16:54:50
【问题描述】:

我正在构建一个涉及 3 种语言的简单 Web 应用程序,我想使用所选语言的部分 html 文件动态更改文本块中的内容;根据我的研究,从 w3schools 设置 ng-view 功能对我来说似乎并不难: ng-routing - w3schools

我想要实现的目标可能很简单,但我无法理解它,我将尝试使用从 w3schools 获取的相同代码块来表达我的想法(下一个代码当然行不通,但我希望它可以解释我的想法):

  var app = angular.module("myApp", ["ngRoute"]);
   app.config(function($routeProvider) {
       // declare variable to evaluate 
       var lang = "(dynamic value)"; // this value will be set dynamically.
       $routeProvider
       // condition if variable value is "es" 
       if (lang == "es") { 
       .when("/es", {
           templateUrl : "es.htm"
       })
      } 
      // else if , load the other language
      else if (lang == "ja") {
       .when("/ja", {
           templateUrl : "ja.htm"
       })
      }
      // if the value is none of above, then load the "default" one
      else { 
       .when("/en", {
           templateUrl : "en.htm"
       });
     }
   });

我希望我的问题不会太令人困惑,我对 $resolve 和 $route 回调进行了研究,但我无法弄清楚它们,感谢任何帮助。

【问题讨论】:

  • 路由是否需要在 app.config 中设置,或者这个逻辑可以稍后在控制器中完成?
  • @stevenelberger 不,可以稍后在控制器中完成,这个条件只会在加载时检查,用户第一次进入网站时,之后就没有必要了。

标签: javascript jquery angularjs model-view-controller routing


【解决方案1】:

可以使用ngInclude 指令在控制器中配置此逻辑:

控制器:

app.module("myApp")
   .controller("myController", 
   function() {
       var self = this;
       self.lang = "(dynamic value)";
       self.templatePath = "";
       if (lang === "es") {
           self.templatePath = "(es path here)";
       } else if (lang === "ja") {
           self.templatePath = "(ja path here)";
       } else {
           self.templatePath = "(en path here)";
       }
   });

查看:

<div ng-controller="myController as myCtrl">
    <div ng-include="myCtrl.templatePath"></div>
</div>

这也可以通过templateUrl 使用$routeProvider 作为函数来完成,例如:

app.config(function($routeProvider) {
    $routeProvider.
        when('/:lang/somePage', {
            templateUrl: function(urlAttr) {
                if (urlAttr.lang === "es") {
                    return "/pathForEs";
                } else if (urlAttr.lang === "ja") {
                    return "/pathForJa";
                } else {
                    return "/pathForEn";
                }
            },
            controller: "somePageController"
        }).
        otherwise({
            routeTo: "/",
        });
});

【讨论】:

  • 对于 ng-include 方式,有没有办法我也可以制作某种形式的 "navigation" ,所以,如果用户以 "es" 的值进入站点,并获得"/es-path" 然后用户可以将其更改为 "/ja-path" 或 "/en-path",其中 /en-path 应该是默认值;我想我不得不说我用 js 获得了这些值,就像这样:var language = window.navigator.userLanguage || window.navigator.language; var lang = language.substr(0, 2);有没有办法让导航来完成这个?
  • 您可以在视图中有一个带有 ng-click 指令的链接,该指令链接到控制器中更改路径的函数(例如,ng-click="myCtrl.changePath()")
  • 我正在努力让它工作,但它似乎没有,我想得到这个值:
    var language = window.navigator.userLanguage || window.navigator.language; var lang = language.substr(0, 2); 然后基于获得的值(这是一个2 个字母字符串 "es" , "ja", "en" ) 设置部分内容基于它,我正在尝试使用 ngInclude 方式,但范围似乎没有得到语言值,nohting正在控制台中显示,因此没有设置或显示,不确定代码应该如何看待“最终形式”
  • 尝试在控制器中引用窗口应该通过 $window 服务来完成。根据原始问题,我认为我的回答提供了足够的解决方案,因此请将其标记为已接受,如果还有其他问题,您需要在 StackOverflow 上创建一个新问题。谢谢! :)
猜你喜欢
  • 2016-11-17
  • 2022-01-24
  • 1970-01-01
  • 2015-11-25
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2016-01-04
相关资源
最近更新 更多