【问题标题】:Angular UI Router: decide child state template on the basis of parent resolved objectAngular UI Router:根据父解析对象决定子状态模板
【发布时间】:2014-08-13 23:27:18
【问题描述】:

这是我的 app.js 文件- 我有一个父状态和两个子状态。 两个子视图都需要该对象。

    states.push({
      name: 'parentstate',
      url: '/parent/:objId',
      abstract: true,
      templateUrl: 'views/parentview.html',
      controller: function() {},
      resolve: {
        obj: function(OBJ, $stateParams) {
          return OBJ.get($stateParams.objId);
        }
      }
    });

我想用这个解析的 obj 来决定子模板

    states.push({
      name: 'parentstate.childs',
      url: '/edit',
      views: {
        "view1@parentstate": {
          templateUrl: 'views/view1',
          controller: 'view1Ctrl'
        },
        "view2@parentstate": {
          templateUrl: function(obj) {
            if (obj.something == something) {
              return "views/view2first.html";
           } else {
              return 'views/view2second.html';
            }
          },
          controller: 'view2Ctrl'
        }
      }  
    });

我怎样才能做到这一点?

【问题讨论】:

    标签: javascript angularjs angular-ui-router


    【解决方案1】:

    有一个有效的example。我们应该使用templateProvider 而不是templateUrl。这是新的状态定义:

      $stateProvider
        .state('parentstate.childs', {
          url: '/edit',
          views: {
            "view1@parentstate": {
              templateUrl: 'views.view1.html',
              controller: 'view1Ctrl',
            },
            "view2@parentstate": {
              templateProvider: function($http, $stateParams, OBJ) {
    
                var obj = OBJ.get($stateParams.objId);
                var templateName = obj.id == 1
                  ? "views.view2.html"
                  : "views.view2.second.html"
                  ;
            
                return $http
                      .get(templateName)
                      .then(function(tpl){
                        return tpl.data;
                      });
              },
              controller: 'view2Ctrl',
            }
          }
        });
    

    我们为什么要使用这种方法?如此处所述:

    Templates

    模板网址
    ...templateUrl 也可以是返回 url 的函数。 它需要一个预设参数stateParams,不注入。

    模板提供者
    或者您可以使用 模板提供程序 函数,该函数可以注入,可以访问本地,并且必须返回模板 HTML,如下所示:

    在这个有效的plunker 中检查基于TemplateProvider 的解决方案

    【讨论】:

    • 但我也想在 view1Ctrl 中使用该 obj。而且我不想进行两次 api 调用。
    • 我向你展示了ui-router 的强大功能。另外,我试图向您解释模板是如何设计的,我们可以用TemplateUrlTemplateProvider 实现什么。现在就看你如何解决boj的重用了。我会投票支持缓存...但这不是ui-router 的责任...顺便说一句,根据我的经验,我从不需要通过某些参数来驱动模板选择。只需驱动状态及其模板...在模板内部使用directives 根据内容呈现内容...有帮助吗?
    • 是的,它肯定有帮助。正如您所说,您永远不需要根据某些参数来决定模板。我认为我的方法是错误的,我应该再想一想。我将看看如何在这种情况下使用指令。谢谢。
    • 如果有帮助的话就太好了。我正在使用 ui-router,无法想象没有它的世界。只是我们的想法必须有点改变;)一旦您获得 15 (或更多)声望,您就可以投票……但您可以接受!如果 asnwer 有帮助并获得一些分数;)祝你好运ui-router
    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多