【问题标题】:AngularJS: Binding not working correctlyAngularJS:绑定无法正常工作
【发布时间】:2015-11-18 05:33:45
【问题描述】:

我有一个登录页面,显示在我的 index.html 页面中。 index.html 页面可以控制一个导航栏,在用户成功登录之前我不想显示该导航栏。但是,在他们登录后,导航栏 ng-show 属性不会更新,因为我有它代码。这是说明的代码:

<nav class="navbar navbar-inverse" ng-controller="loginController" ng-show={{valid}}>
    <div class="collapse navbar-collapse navbar-collapse-links">
        <ul class="nav navbar-nav">
            <li><a ui-sref="addUser" class="addUser" >Add User</a></li>
            <li><a ui-sref="listUser" class="mdUser">Modify User</a></li>
            <li><a ui-sref="login" class="mdUser">Logout</a></li>
        </ul>
    </div>
</nav>

我的控制器内部是这样的:

$scope.valid = false;
function login() {
    AuthenticationService.Login(vm.user.username, vm.user.password, function (response) {
        if (response.success) {
            AuthenticationService.SetCredentials(response.token.UserName, response.token.TokenId);
            $scope.valid = true;
            $location.path('/');
            } else {
                //FlashService.Error(response.message);
                vm.error = response.message;
                vm.dataLoading = false;
            }
    ....
    )};
}

这些是对代码的粗略复制和粘贴,仅包含我认为当前问题所必需的内容。

我可以手动将声明更改为 true 或 false,并让导航栏正确运行。否则,在有效登录尝试后导航栏不会显示,并且当我登录后在控制台中检查 html 时,ng-show 方法仍然显示为 false。

问题:为什么在我的成功函数中重新分配有效绑定后无法正确更改?

【问题讨论】:

  • 你的 authenticationService 是什么?旁注,ng-show 不需要 {{}}。 ng-show="valid" 很好
  • 它是一项自定义服务,我必须通过我们的后端进行身份验证。已完成测试及其工作方式应该如何......应该不是问题

标签: javascript html angularjs data-binding ng-show


【解决方案1】:

如果您的 AuthenticationService 没有抽出摘要循环,Angular 将不会更新其绑定,因为它不知道发生了什么变化。

尝试将 .Login 回调的主体包裹在 $scope.$apply() 中。

此外,您在验证用户身份后立即离开此视图,因此您设置 $scope.valid = true; 的范围消失了。

您可以尝试在根作用域上设置一个标志,例如:$rootScope.isLoggedIn = true; 并对其进行绑定,因为根作用域在应用程序的整个生命周期内都会保留。

您最好的选择是将身份验证状态存储在您的服务中并与之绑定。由于服务是单例的,因此视图之间的状态也会保留。

【讨论】:

  • 如何让 ng-show 查找 rootscope.valid 而不是其本地“有效”?没关系,只需要一点研究
  • 对于你想要做的事情,使用 ui-router 并为你的应用程序 chrome 做一个父视图可能会更好。这样,您可以轻松地拥有一个不受 chrome 父级影响的登录路由,并且没有标题,因为没有标题。然后每个视图(您受保护的视图)都将由该视图作为父级。您所要做的就是在渲染子视图内容的父视图中放置一个&lt;ng-view/&gt;
【解决方案2】:

尝试改变,

<nav class="navbar navbar-inverse" ng-controller="loginController" ng-show={{valid}}>

<nav class="navbar navbar-inverse" ng-controller="loginController" ng-show="valid">

【讨论】:

    【解决方案3】:

    从 ng-show 中删除 {{ }}。这是您的代码的一个问题。

    ng-show="valid"
    

    并查看此以获取更多信息:

    http://jaketrent.com/post/when-to-use-curlies-in-angular-directives/

    【讨论】:

    • 很高兴知道,但我更改了它仍然没有绑定
    • 你看到 joshperry 的回答了吗?您的代码中可能存在一些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2021-11-08
    • 2017-02-09
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多