Angular UI Router:根据父解析对象决定子状态模板

vai*_*khl 9 javascript angularjs angular-ui-router

这是我的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);
        }
      }
    });
Run Code Online (Sandbox Code Playgroud)

我想用这个解决的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'
        }
      }  
    });
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这一目标?

Rad*_*ler 8

有一个工作的例子.而不是templateUrl我们应该使用templateProvider.这是新的状态def:

  $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',
        }
      }
    });
Run Code Online (Sandbox Code Playgroud)

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

模板

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

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

检查TemplateProvider此工作的plunker中的基础解决方案