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

Angular和UI-Router,如何设置动态templateUrl

凌和悦
2023-03-14
问题内容

如何使用从数据库中获取的名称作为templateUrl文件名?

我已经试过了:

$stateProvider.state('/', {
  url: '/',
  views: {
    page: {
      controller: 'HomeCtrl',
      templateProvider: function($templateFactory, $rootScope) {
        console.log("$rootScope.template")
        return $templateFactory.fromUrl('/templates/' + $rootScope.template);
      }
    }
  }
});

如果我的$ rootScope.template来自数据库查询,那似乎不起作用。不知道为什么,但是不起作用。

如果在我的控制器中执行$ rootScope.template =“
whatever.html”,则一切正常,但是,如果我从数据库中查询模板,则什么也不会发生。templateProvider中的console.log(“
$ rootScope.template”)不能给我任何东西(查询本身可以正常工作)。

查询是否只是花了太长时间而没有为路由器准备就绪,或者发生了什么?

那是我做错了,该如何解决?


问题答案:

就像在此问答中所讨论的:Angular UIRouter:基于父解析对象决定子状态模板,我们可以像这样

这可能是“来自服务器/数据库加载模板名称”的服务:

.factory('GetName', ['$http', '$timeout',
    function($http, $timeout) {
      return {
        get : function(id) {
          // let's pretend server async delay
          return $timeout(function(){
            // super simplified switch... but ...
            var name = id == 1
                  ? "views.view2.html"
                  : "views.view2.second.html"
                  ;
            return {templateName : name}; 
          }, 500);
        },
      };
    }
]);

然后,templateProvider定义将如下所示:

  views: {
    "page": {
      templateProvider: function($http, $stateParams, GetName) {

        // async service to get template name from DB
        return GetName
            .get($stateParams.someSwitch)
            // now we have a name
            .then(function(obj){
               return $http
                  // let's ask for a template
                  .get(obj.templateName)
                  .then(function(tpl){
                      // haleluja... return template
                      return tpl.data;
               });      
            })

      },

该代码应具有自我解释性。查看此答案及其插件以获取更多详细信息



 类似资料:
  • 问题内容: 假设我有以下3个Angular UI Router状态: 如果直接转换为,我该如何告诉Angular UI Router进入状态? 理想情况下,我想要的是这样的: 然后,在我的代码中,我希望$ state.go(’adminCompanies’)等同于$ state.go(’adminCompanies.list’) 问题答案: 由于您的应用程序当前已设置,因此您不需要任何明确的逻辑。

  • 问题内容: 您好,我是angularJS的新手,并一直在尝试阻止根据用户critera访问某些状态。 这是从ui-router的FAQ中准确描述的,但是我无法使其正常工作。我需要什么,但要在数据对象中准确地完成此操作? (我看到有人在某些博客文章教程中投入“ true”,并像我一样使用它,但这似乎不起作用,因为我收到一条错误消息,指出needAdmin未定义) 这是我的代码: 问题答案: 如果状态

  • 问题内容: 给定这样的HTML文件: 如何创建一个布局状态,以一个标题模板填充“标题”,用一个脚注模板填充页脚,然后允许子状态填充空的ui视图? 我想空的ui-view也可以命名为ui-view =“ main”。 问题答案: 一种方法是建立全局“根”状态。因此, 每个 州都是孩子。像root.pages,root.pages.edit,root.settings等。然后,您可以提供页眉和页脚的默

  • 问题内容: 我正在尝试找到一种优雅的方法来创建一个自定义的 body标签 动态类,该类可以从中轻松设置,如果未设置,则可以使用默认选项或不使用。 例: routes.js 简单标记HTML 场景: 1 -参观 登录 我应该有 一流 的身体等于 2-此时访问 寄存器 ,它将具有相同的类 3-访问 个人资料* ,身体将具有 默认 类别或 没有 默认 类别 * 您如何实现的? 问题答案: 您可以拥有一个

  • 问题内容: Web应用程序的一个关键组件是面包屑/导航。使用Angular UI Router,将面包屑元数据放在各个状态中而不是放在控制器中是有意义的。手动为需要的每个控制器创建面包屑对象是一项直截了当的任务,但这也是一个非常麻烦的任务。 我已经看到了一些使用Angular的自动面包屑的解决方案,但是老实说,它们相当原始。某些状态,例如对话框或侧面板,不应更新面包屑,但是如果将当前的附加组件添加

  • 本文向大家介绍Angular-Ui-Router+ocLazyLoad动态加载脚本示例,包括了Angular-Ui-Router+ocLazyLoad动态加载脚本示例的使用技巧和注意事项,需要的朋友参考一下 在使用angular过程以前同事是采取一次性加载方式,在index页面一次性加载所有的js跟css,这种加载方式只适合教学和小型项目中,中大型不建议使用,加载速度影响到用户体验。 在使用了Ui