【问题标题】:ng-show ng-hide: What qualifies as truthy value?ng-show ng-hide:什么才是真实值?
【发布时间】:2015-09-23 12:06:05
【问题描述】:

我正在构建一个 Angular 应用程序并使用 cookie 设置值,以便在页面刷新发生时持久性应该存在,即如果我已登录,我应该看到配置文件和注销页面,如果我没有登录,我应该请参阅注册/登录页面。 这是代码。

app.controller("NavCntrl", function($scope, $http, $rootScope, $location, $cookies)
{
    $scope.logout = function()
    {
        console.log("Logout");
        //$rootScope.currentUser=undefined;
        $cookies.put('loggedIn', "");
        //$location.url('/home');
    }
 $scope.loggedIn = $cookies.get('loggedIn');
 if($scope.loggedIn == "true")
 {
    $scope.loggedOut = "";
 }
 else
 {
    $scope.loggedOut = "true";
 }
}); 

html 看起来如下

<nav ng-controller ="NavCntrl" class="navbar navbar-default" >
<div >
    <a href="/home" class="navbar-brand" >Home</a>
    <span ng-show = "loggedOut">
        <a href="/login" class="navbar-brand" >Login</a> 
        <a href="/register" class="navbar-brand">Register</a>  
    </span> 
    <span ng-show = "loggedIn">
        <a href="/logout" ng-click=logout() class="navbar-brand">Logout</a> 
        <a href="/profile" class="navbar-brand">Profile</a>
    </span>
</div> 
</nav>

现在每当我登录时,我都会设置这个$cookies.put("loggedIn", true);

我在调试 Angular 时看到的行为是,有时被评估的值是正确的,但 HTML 没有得到如下更新。 我在考虑我对真实表达的理解是错误的。 什么使表达式被设置为真? 正如我在示例中看到的,有些人只是将其等同于空白字符串以认为它是假的,或者有时他们给出布尔值? 如何纠正我的应用程序的行为?

【问题讨论】:

  • 在 js 中符合条件的相同表达式,在 angularJS 中也符合条件。请记住:AngularJS 表达式只是 Javascript 表达式。这能回答你的问题吗?

标签: javascript angularjs cookies


【解决方案1】:

来自评论:在 js 中符合条件的相同表达式在 angularJS 中符合条件。请记住:AngularJS 表达式只是 Javascript 表达式。

此外,您似乎将布尔值作为字符串放置。你为什么不使用真/假呢?像这样的:

app.controller("NavCntrl", function($scope, $http, $rootScope, $location, $cookies)
{
    $scope.logout = function()
    {
        console.log("Logout");
        //$rootScope.currentUser=undefined;
        $cookies.put('loggedIn', false);
        //$location.url('/home');
    }
    $scope.loggedIn = $cookies.get('loggedIn');
    if($scope.loggedIn)
    {
        $scope.loggedOut = false;
    }
    else
    {
        $scope.loggedOut = true;
    }
}); 

【讨论】:

  • 对于 $scope.loggedOut="" 。为什么它被认为是 ng-show 的假?因为您将一个设置为true,另一个设置为""
  • 因为在 javascript "" == false // It's true
  • 好吧,我应用了修复程序。它仍然不起作用。我的意思是 ng-show 无法更新它。即使在登录后,我也会看到登录/注册屏幕。还有什么问题?
  • 将函数用引号括起来以确保:&lt;a href="/logout" ng-click="logout()" class="navbar-brand"&gt;Logout&lt;/a&gt;
  • 现在,我看不到 cookie 登录的位置。介意解释一下吗?
【解决方案2】:

问题在于你的逻辑一开始。如果你想坚持 cookie 的想法,我会做这样的事情......

app.controller("NavCntrl", function($scope, $http, $rootScope, $location, $cookies)
{
    $scope.loggedIn = $cookies.get('loggedIn');

    $scope.logout = function()
    {
        console.log("Logout");
        $cookies.put('loggedIn', 'false');
        $scope.loggedIn = $cookies.get('loggedIn');
    };

    $scope.login = function()
    {
        console.log("Login");
        $cookies.put('loggedIn', 'true');
        $scope.loggedIn = $cookies.get('loggedIn');
    };

}); 

然后在你的 html 中使用这个逻辑...

<nav ng-controller ="NavCntrl" class="navbar navbar-default" >
<div >
    <a href="/home" class="navbar-brand" >Home</a>
    <span ng-show = "loggedIn == 'false'">
        <a href="/login" ng-click=login() class="navbar-brand" >Login</a> 
        <a href="/register" class="navbar-brand">Register</a>  
    </span> 
    <span ng-show = "loggedIn == 'true'">
        <a href="/logout" ng-click=logout() class="navbar-brand">Logout</a> 
        <a href="/profile" class="navbar-brand">Profile</a>
    </span>
</div> 
</nav>

【讨论】:

  • 我又注意到了一件事。我包含的 html 文件是我的 index.html 。以及我给$location.url('/home')的所有地方。这样登录后它就会重定向到主页。因此,如果登录后当我的地址栏读取时。 http://localhost:8082/home 然后我点击刷新我得到了正确的值。即如果我已登录,我将获得注销/个人资料页面或如果我已注销登录/注册页面。长话短说需要刷新整个页面才能显示这些更改。这是为什么?如果你不明白,请告诉我。我会尝试以更好的方式解释它
  • 如果不了解您是如何将应用程序组合在一起的,那么可能会有一百万个错误,所以很难猜到。也就是说,您可以尝试将 $scope 替换为 $rootScope 作为您的 loggedIn 变量,以使其可用于您的所有控制器。
【解决方案3】:

您正在为"true" 使用字符串值,这与使用booleantrue 不同

【讨论】:

  • 但是无论如何,OP 正在制作一个计算结果为布尔值的表达式
猜你喜欢
  • 2016-02-17
  • 2014-12-08
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2015-01-30
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多