当param存在时,如何提供单独的`template`?

时间:2016-10-20 06:57:35

标签: angularjs angular-ui-router state

我有一个方案来处理params。 (当param存在时,它会以不同的方式处理)

那么,我如何保留2个模板并根据要求使用它们?目前我正在尝试这样,这根本不起作用。

任何人帮助我?

我的状态有2个模板:(请帮我纠正)

x = 5 | 1 0101 | 0001 0101 = 5

这里是两个场景的重定向:(如果我错了,请纠正我)

.state('serialCreateCase', {
    url: '/serialCreateCase?sn=',
    views:{
      "" : {
        "templateUrl": 'app/login/loginWithSerial.html'
      },
      "?sn=" : {
        "templateUrl": 'app/login/login.html'
      }
    }
 })

2 个答案:

答案 0 :(得分:1)

有一个working plunker

我想说你需要用

代替templateUrl
  

Templates

     

TemplateUrl ...

     

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

     

TemplateProvider

     

或者您可以使用模板提供程序函数,该函数可以注入,可以访问本地,并且必须返回模板HTML,   像这样...

有更多细节和掠夺者

这我最喜欢

...
templateProvider: [$stateParams, '$templateRequest',
  function($stateParams, templateRequest) 
  {
    var tplName = "pages/" + $stateParams.type + ".html";
    return templateRequest(tplName);
  }
],

(选中here),因为它也使用 $templateRequest

EXTEND

有一个working plunker

这可能是状态def

  .state('serialCreateCase', {
    url: '/serialCreateCase?sn',
    views: {
      "": {
        templateProvider: ['$stateParams', '$templateRequest',
          function($stateParams, templateRequest) {
            var tplName = "app/login/loginWithSerial.html";
            if($stateParams.sn){
               tplName = "app/login/login.html";
            }
            return templateRequest(tplName);
          }
        ]
      },
    }
  });

我们真正需要的是始终传递一些价值,如 sn 。所以,这些应该是电话:

  // we need to pass some value, to be sure that there will be other than last
  <a ui-sref="serialCreateCase({sn: null})">
  // here is reasonable value
  <a ui-sref="serialCreateCase({sn:'1234'})">

检查here实际操作

答案 1 :(得分:1)

使用,$stateParams代替toParams

1)根据参数确定模板(您的要求)

.state('serialCreateCase', {
        url: '/serialCreateCase?sn=',
        views: {
            '': {
                templateUrl: function(stateParams) {
                    var param = stateParams.sn
                    return (param == undefined) ? 'app/login/loginWithSerial.html' : 'app/login/login.html'
                },
                controller: 'myController',
            }
        }
      })

您可以使用stateParam参数查看templateUrl,然后更改模板。

2)根据控制器的参数更改状态。

这是一个示例控制器,您可以在其中查看state parameter并按照您的意愿使用重定向。

allControllers.controller('myController', ['$scope','$rootScope','$state','$stateParams',
    function($scope,$rootScope,$state,$stateParams) {
        if(!$rootScope.isUserLoggedIn)
        {
            if($stateParams.sn !== undefined )  
            {
                alert('dont take action', $stateParams.sn );
            }
            else
            {
                alert('You can redirect, no parameter present');    
            }

        }
    }   
}])