当前位置: 首页 > 面试题库 >

AngularJS-UI路由器-如何配置动态视图

江礼骞
2023-03-14
问题内容

我很难找到有关通过数据库动态使用ui路由器的任何文档。当然,所有内容都经过硬编码。

我的杰森:

[
   {
       "name": "root",
       "url": "/",
       "parent": "",
       "abstract": true,
       "views": [
            {"name": "header", "templateUrl": "/app/views/header.html"},            
            {"name" :"footer", "templateUrl": "/app/views/footer.html" }
       ]
   },
    {
        "name": "home",
        "url": "",
        "abstract" : false,
        "parent": "root",
        "views": [
            {"name": "container@", "templateUrl": "/app/views/content1.html"},            
            {"name" :"left@", "templateUrl": "/app/views/left1.html" }
       ]
    },
    {
        "name": "about",
        "url": "/about",
        "abstract": false,
        "parent": "root",
        "views": [
             {"name": "container@", "templateUrl": "/app/views/content2.html"},            
             {"name" :"left@", "templateUrl": "/app/views/left2.html" }
            ]
    }
]

我的应用程式:

'use strict';

var $stateProviderRef = null;
var $urlRouterProviderRef = null;

var app = angular.module('app', ['ngRoute', 'ui.router']);


 app.factory('menuItems', function ($http) {
    return {
      all: function () {
        return $http({
            url: '/app/jsonData/efstates.js',
            method: 'GET'
        });
    }
  };
 });


  app.config(function ($locationProvider, $urlRouterProvider, $stateProvider) {
    $urlRouterProviderRef = $urlRouterProvider;
    $stateProviderRef = $stateProvider;
    $locationProvider.html5Mode(false);
    $urlRouterProviderRef.otherwise("/");
  });


  app.run(['$q', '$rootScope', '$state', 'menuItems',
  function ($q, $rootScope, $state, menuItems) {
      menuItems.all().success(function (data) {
          angular.forEach(data, function (value, key) {                
              $stateProviderRef.state(name = value.name, {
                  "url": value.url,
                  "parent" : value.parent,
                  "abstract": value.abstract,
                  "views": {
                     // do not want the below hard coded, I want to loop
                     // through the respective json array objects and populate state & views 
                     // I can do this with everything but views.

                     // first loop
                     'header': { 'templateUrl': '/app/views/header.html' },
                     'footer': { 'templateUrl': '/app/views/footer.html' },

                     // second loop
                     'left@':  { 'templateUrl': '/app/views/left1.html' },
                     'container@': { 'templateUrl': '/app/views/container1.html' },

                     // third loop
                     'left@':  { 'templateUrl': '/app/views/left2.html' },
                     'container@': { 'templateUrl': '/app/views/container2.html' },
                }
            });
        });
        $state.go("home");
    });
 }]);

我很难动态配置视图。有任何想法吗?

更新:

我根据RadimKöhler
的回答做了一个Plunker。感谢您的帮助。

我认为ui-router是defacto路由器,它具有动态性,它将使大型应用程序更易于管理。


问题答案:

有一个显示我们如何动态配置视图的插件。的更新版本.run()如下:

app.run(['$q', '$rootScope', '$state', '$http',
  function ($q, $rootScope, $state, $http) 
  {
    $http.get("myJson.json")
    .success(function(data)
    {
      angular.forEach(data, function (value, key) 
      { 
          var state = {
            "url": value.url,
            "parent" : value.parent,
            "abstract": value.abstract,
            "views": {}
          };

          // here we configure the views
          angular.forEach(value.views, function (view) 
          {
            state.views[view.name] = {
              templateUrl : view.templateUrl,
            };
          });

          $stateProviderRef.state(value.name, state);
      });
      $state.go("home");    
    });
}]);

在这里检查所有动作



 类似资料:
  • 问题内容: 我有如下配置: 玉器主锉 因此,模块将填充到占位符中。但是问题是,我在模板中还有2个命名视图。模板如下所示: leftSidePaneModule.html 如何使模块和在被填充到上述占位? 我试过了, 尝试次数:2 两者都不起作用。 你怎么做呢? 谢谢! 问题答案: 解决方案可在此处找到:视图名称-相对名称与绝对名称。引用: 在幕后,每个视图都被分配一个遵循的方案的绝对名称,其中指令

  • 我的配置如下所示: 主玉锉 因此,模块被填充到ui-view='leftSidePaneModule占位符中。但问题是,我在模板中有2个命名的视图。 leftSidePaneModule。html 如何制作模块 我试过了, 尝试: 2 两者都不起作用。 你是怎么做到的? 谢谢

  • 问题内容: 我目前有一个内置路由的AngularJS应用程序。它可以正常工作,并且一切正常。 我的app.js文件如下所示: 我的应用程序内置了CMS,您可以在其中复制 / pages 目录中的新html文件并添加新的html文件。 即使对于新动态添加的文件,我仍然希望通过路由提供程序。 在理想的情况下,路由模式为: $ routeProvider.when(’/ pagename ‘,{temp

  • 问题内容: 我正在建立一个带有角度UI路由器的静态HTML网站进行导航。我基本上有一个带有多个(10+)html模板(页面)的ui视图,可以加载到该视图中。我所有的模板页面都位于名为“页面”的目录中。 所以我基本上想知道我们是否可以在$ stateProvider中仅定义一个状态来动态分配多个模板url,而不是为每个HTML模板页面编写不同的状态(如下所述)。 任何帮助深表感谢。 问题答案: 那应

  • 问题内容: 我有一个如下所示的route.js: 考虑到我要创建200多种不同的路线,最终我会遇到诸如“ article1”,“ article2”等内容 而我的app.js就像: 有没有动态的方式来创建这个? 问题答案: 终于成功了。 在我遇到的情况下,第1条,第2条等: 在获得多级网址的情况下,我创建了一个自定义函数:

  • 问题内容: 我正在尝试测试一些视图,这些视图用于链接到应用程序中的其他状态。在我的测试中,我触发了对此元素的点击,如下所示: 如果状态切换为,该如何测试?在我的控制器中像这样使用时,这很容易: 但是当我使用时,我不知道要监视什么对象。如何验证我的应用程序处于正确状态? 问题答案: 我自己找到的。在查看了角度ui路由器源代码后,我在指令中找到了以下行: 当元素收到点击时,会包装在回调中。因此,在测试