如何让AngularUI Router登录页使用空白模板,不注入main@视图?
我明白你想要的效果——登录页面干干净净,没有多余的布局元素,只保留登录表单本身对吧?结合你用stateHelperProvider配置的嵌套状态,这里有几个简洁的实现方案:
方法一:给
public父状态设置空白模板 既然login是public的子状态,你可以直接给public状态指定一个极简的空白模板,这样它的所有子状态都会基于这个空白布局渲染,不会继承root状态里可能带的导航、侧边栏之类的冗余元素。修改你的配置如下:
stateHelperProvider.setNestedState({ name: "root", children: [ { name: "public", authenticate: false, // 极简空白模板,仅保留视图占位符 template: "<div ui-view='main'></div>", children: [ { name: "login", url: "/", title: "Login", views: { // 明确指定渲染到public状态的main视图(可选,但更严谨) "main@public": { controller: "LoginController", templateUrl: "/views/login.html" } } }, ] } ] });
这里把views里的main@改成main@public是更清晰的写法,明确指定渲染目标;如果根状态本身没有main视图,原来的main@写法也能生效,但推荐用更明确的命名。
方法二:单独给
login状态指定根空白模板 如果你只想让login页面用空白布局,其他public子状态仍保留原有布局,可以在login的views里直接覆盖根视图(即整个页面的最外层模板):
stateHelperProvider.setNestedState({ name: "root", children: [ { name: "public", authenticate: false, children: [ { name: "login", url: "/", title: "Login", views: { // 先给根视图设置空白模板 "@": { template: "<div ui-view='main'></div>" }, // 再把登录内容注入到这个空白模板的main视图中 "main@": { controller: "LoginController", templateUrl: "/views/login.html" } } }, ] } ] });
这里的@代表根状态的视图,我们给它设置一个仅包含ui-view='main'的空白模板,登录内容就会渲染在这个纯净的容器里,整个页面只会显示登录表单。
方法三:极简inline模板(适合简单登录页)
如果你的登录HTML代码非常简短,甚至可以直接把模板写在配置里,省掉单独的login.html文件,进一步简化:
stateHelperProvider.setNestedState({ name: "root", children: [ { name: "public", authenticate: false, template: "<div ui-view></div>", children: [ { name: "login", url: "/", title: "Login", controller: "LoginController", // 直接内嵌登录表单模板,无需单独文件 template: ` <div class="login-container"> <form ng-submit="login()"> <input type="email" ng-model="user.email" placeholder="邮箱"> <input type="password" ng-model="user.password" placeholder="密码"> <button type="submit">登录</button> </form> </div> ` }, ] } ] });
这种方式最极致,连视图文件都不需要维护,适合逻辑简单的登录页面。
你可以根据自己的实际需求选择方案:方法一适合整个public系列页面都用空白布局;方法二更灵活,仅针对login;方法三是极简到极致的写法~
内容的提问来源于stack exchange,提问作者dǝɥɔS ʇoıןןƎ
相关产品推荐
相关产品推荐

