AngularJS:用户身份验证后重新加载 ng-include (或解决问题的更好方法)

2024-02-15

我真的只是在学习 Angular,我正在尝试创建一个基于身份验证限制内容访问的应用程序。我的身份验证部分正在工作(也使用 Laravel PHP 框架),但我在根据身份验证状态“重新加载”某些内容时遇到问题,即在身份验证成功后。

最初,我想做的是在用户登录后更新主导航菜单。我确信有更好的方法,但到目前为止我所拥有的是从服务器返回的视图,该视图具有不同的导航元素,具体取决于是否用户是否登录,然后使用 ng-include 将其加载到元素中。

有一个登录选项,它将登录表单加载到 ng-view 中。用户登录后,我想用服务器的视图刷新 ng-include 。

有没有办法在成功登录后在 ng-include 中重新加载该模板?

如果这是错误的方法,请随时推荐更好的技术来解决此问题。当然,这在 jQuery 中很容易做到,但我更喜欢用 Angular 的方式来做事。

这是到目前为止我的一些代码:

索引.html:

<div class="container" ng-controller="appController">

    <div id="nav" ng-include src="menuUrl()"></div>

    <div class="row">
        <div class="span3" ng-include src="'partials/brands.html'" ng-controller="brandController"></div>
        <div class="span9" ng-view></div>
    </div>

</div>

一些控制器:

.controller('appController', function($scope){
    $scope.loggedIn = false;

    $scope.menuUrl = function() {
        return "partials/nav.html";
    };

})
.controller('loginController',function($scope, $sanitize, $location, Authenticate, Flash){
    $scope.login = function(){
        Authenticate.save({
            'email': $sanitize($scope.email),
            'password': $sanitize($scope.password)
        },function() {
            $location.path('/products')
            Flash.clear()
            sessionStorage.authenticated = true;
        },function(response){
            Flash.show(response.flash)
        })
    }
})
.controller('logoutController',function($scope, $location, Authenticate, Flash){
    $scope.logout = function (){
        Authenticate.get({},function(response){
            delete sessionStorage.authenticated
            Flash.show(response.flash)
            $location.path('/login')
        })
    }
})

服务:

.factory('Authenticate', function($resource){
    return $resource("/service/authenticate/")
})
.factory('Flash', function($rootScope){
    return {
        show: function(message){
            $rootScope.flash = message
        },
        clear: function(){
            $rootScope.flash = ""
        }
    }
})

App:

 .config(['$routeProvider',function($routeProvider){
        $routeProvider.when('/', {
            templateUrl: 'partials/home.html', 
            controller: 'homeController'
        })

        $routeProvider.when('/login', {
            templateUrl: 'partials/login.html', 
            controller: 'loginController'
        })

        $routeProvider.when('/logout', {
            templateUrl: 'partials/logout.html', 
            controller: 'logoutController'
        })

        $routeProvider.otherwise({redirectTo :'/'})
    }])
    .config(function($httpProvider){

        var interceptor = function($rootScope,$location,$q,Flash){

        var success = function(response){
            return response
        }

        var error = function(response){
            if (response.status == 401){
                delete sessionStorage.authenticated
                $location.path('/')
                Flash.show(response.data.flash)

            }
            return $q.reject(response)

        }
            return function(promise){
                return promise.then(success, error)
            }
        }
        $httpProvider.responseInterceptors.push(interceptor)
    })
    .run(function($http,CSRF_TOKEN){
        $http.defaults.headers.common['csrf_token'] = CSRF_TOKEN;
    })

拉拉维尔视图:

<ul class="nav nav-tabs">
  <li><a href="#/">Home...</a></li>
  @if(!Auth::check())
  <li><a href="#/login">Log-in</a></li>
  @else
  <li><a href="#/logout">Log-out</a></li>
  @endif
  <li><input name="search" id="search" type="search" placeholder="Search products..." />
</ul>

当用户在 rootscope 上成功登录时,您可以使用广播方法引发一个事件

$rootScope.$broadcast('userLoggedIn',{user:user});

On the appController您可以订阅该事件

$scope.$on("userLoggedIn",function(event,args) {
     $scope.menuUrl=null;
     $scope.menuUrl="partials/nav.html";
});

这也意味着将 menuUrl 更改为控制器和 html 绑定中的属性。

另外,如果您可以为登录用户和匿名用户定义多个服务器视图,那么您可以在用户登录时翻转视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS:用户身份验证后重新加载 ng-include (或解决问题的更好方法) 的相关文章

随机推荐

  • 当键名称具有数值时,JSON.parse() 是否真的对属性进行排序?

    这里有很多关于这个问题的帖子 它们都包含很多断言 可以总结如下 永远不能保证对象属性以任何方式排序 JSON parse 从不以任何方式对属性进行排序 显然 我们对上面的 1 没有任何疑问 因此我们可以合理地预期 对于任何操作 属性仅按照它
  • Laravel 5.5 由于存在不活动令牌,页面已过期

    我刚刚使用 php 7 2 在共享主机上部署了我的 laravel 应用程序 应用程序在 DigitalOcean 和我当地的 Homestead 上运行良好 但是当使用 php7 2 托管在共享主机上时 opt alt php72 usr
  • 将 youtube.com 中的视频嵌入到 iPhone 应用程序中

    我正在尝试将 youtube 视频嵌入到我的 iPhone 应用程序中 我正在使用 UIWebView 并将嵌入代码从 youtube 作为 html 字符串加载 所以我有一个带有基本 html 标记的布局 我将这段代码放在那里 问题是视频
  • 什么是 CSS 注入以及如何防止它?

    我听我的朋友谈论这个名为 CSS 注入 的漏洞 但是 我不知道这是什么 一听到它我就想 怎么可能使用 CSS 进行任何恶意活动或攻击 所以我想知道这个 CSS 注入 漏洞是什么以及如何预防它 它是什么 CSS 注入意味着攻击者设法将恶意 C
  • 在 Prolog 中查找图中两个节点之间的最短路径

    我想在 Prolog 中找到两个节点之间的最短路径 我想出了如何找到两个节点之间的所有路径 但不幸的是以下代码陷入了循环 arc a b arc b a arc b c arc c b arc c d arc d c path X Y ar
  • 是否可以在另一个语法定义中重复使用 boost::spirit::qi 语法?

    是否可以重复使用boost spirit qi另一种语法中的语法 例如作为规则 例如 如果我定义一个语法来将文本行解析为保存街道地址的结构 template lt typename iter gt struct address gramma
  • @SpringBootApplication - ComponentScan 在新的 Eclipse 项目中无法按预期工作

    我最近开始使用 Eclipse 从 IntelliJ Idea 迁移 但无论我开始编写新的 SpringBoot 应用程序 我总是遇到这个问题 我的主类上的 SpringBootApplication 未按预期工作 我应该能够在不添加 Co
  • CORS 请求在 docker-compose 环境中失败

    我希望弄清楚为什么在 Firefox 中运行的 React 应用程序中的 API 请求失败 标头如下 Accept Accept Encoding gzip deflate Accept Language en US en q 0 5 Co
  • 为什么 Kit Kat 需要使用 isValidFragment?

    自从 KitKat 发布以来 我注意到我的一大堆应用程序都更新了 修复 Kit Kat 中的崩溃 最近 当我发布自己的应用程序时 我发现其可能的来源是使用首选项活动的新 isValidFragment 要求 然而 我无法让任何人解释为什么突
  • 如何查询 postgres 的可选参数?

    我正在设置一个REST服务和我正在使用postgres作为数据存储 我想知道如何设置postgres查询以使用可选参数 IE SELECT from users where hair color 1 and eye color 2 其中 1
  • 支持 iOS 10 的 Xcode 7.3.1

    现在我有一个基于 Xcode 7 3 1 的应用程序 运行良好 但当我想将应用程序安装到 iOS 10 设备上时 出现了一个问题 提示 找不到开发人员磁盘映像 所以我找到了一个解决方案 如下 https danielemargutti co
  • React:为什么 `this.props.children` 未定义?

    我正在用 ReactJS 构建一个电子电阻计算器 我有一个组合组件声明如下 var ResistanceCalculator React createClass getInitialState function return bands 0
  • XSL if else 条件

    我有一个要求 我想要 if else 语句来检查节点是否具有属性或仅具有字符串 例如 1 个节点有0 File s found另一个具有诸如
  • 在 Kubernetes 中找不到持久卷声明

    目前我尝试实施持续量在我的 yaml 文件中 我在互联网上阅读了很多文档 但我不明白为什么当我进入仪表板窗格时会出现此消息 未找到持久卷声明 karaf conf pod yaml apiVersion v1 kind Pod metada
  • Linux 中 SVN 存储库目录放在哪里?

    我正在 Ubuntu Linux 上设置一个新的 SVN 服务器 放置存储库的好地方 最佳实践 在哪里 我应该创建一个新用户吗 服务器将通过 http 访问 因此无需创建用户帐户等 与 svn 的情况一样 提前谢谢了 我喜欢把东西放在下面
  • Python 访问 JSON 对象中的数据

    所以我在我的脚本中这样做 import json info json loads get info print info 哪个输出 richard richard desktop projects hello python python m
  • 将 libpq.5.dylib 复制到 /usr/lib/libpq.5.dylib

    我无法在 R 中加载包 因为该文件libpq 5 dylib不在 usr lib libpq 5 dylib 它是在 usr local Cellar libpq 13 0 lib libpq 5 dylib 我尝试了这一行 sudo ln
  • iframe 的内容文档

    对于 iframe 甚至旧的 frame 元素 contentDocument 到底代表什么 它相当于 html 元素还是 body 元素 它有什么用 所有浏览器都支持此属性吗 w3 org http www w3 org TR 2003
  • 开头括号中的正则表达式

    我有一个正则表达式试图按专业划分问题 假设我有以下正则表达式 P
  • AngularJS:用户身份验证后重新加载 ng-include (或解决问题的更好方法)

    我真的只是在学习 Angular 我正在尝试创建一个基于身份验证限制内容访问的应用程序 我的身份验证部分正在工作 也使用 Laravel PHP 框架 但我在根据身份验证状态 重新加载 某些内容时遇到问题 即在身份验证成功后 最初 我想做的