【问题标题】:I can't get $scope.$apply to work in AngularJS我无法让 $scope.$apply 在 AngularJS 中工作
【发布时间】:2015-06-23 13:25:55
【问题描述】:

我似乎无法让 $scope.$watch() 在 AngularJS 中工作。我正在尝试“监视”服务中包含的变量。该变量由一个控制器设置,我想对另一台服务器中的变量更改采取行动。任何关于我做错了什么的建议都将不胜感激。这是我的代码: (注意:在 Index.cshtml 代码中,如果我从 div 中删除“data-ng-show”条件,则会显示 div。所以我知道该错误与 data-ng-show 有关="loggedIn" 条件。)

//In services.js file:
function Session() {
    this.loggedIn = false;
    this.updateLogIn = function (value) {
        this.loggedIn = value;
    }
}
angular.module('app.services', []).service('session', [Session]);

angular.module('app.controllers', [])
.controller('HomeCtrl', ['$scope', 'session', function ($scope, session) {
    $scope.loggedIn = session.loggedIn;

    $scope.$watch(
        function () {
            session.loggedIn;
        },
        function (newVal, oldVal) {
            if (newVal != undefined) {
                $scope.loggedIn = newVal;
            }
        },
        true
    );
}])
.controller('LoginCtrl', ['$scope', 'session', function ($scope, session) {
    $scope.loggedIn = session.loggedIn;
    $scope.login = function () {
        var s = "UserName=" + $scope.userName + "&Password=" + $scope.password;
        $.ajax({
            type: "POST",
            url: "http://localhost:50227/api/Authentication",
            data: s
        })
        .fail(function () {
            session.updateLogIn(false);
        })
        .done(function (data) {
            var tmp = JSON.parse(data);
            // do stuff with sessionStorage...
            session.updateLogIn(true);
        })
        .always(function () {
            $scope.loggedIn = session.loggedIn;
            $scope.$apply();
        })
    };
    $scope.logout = function () {
        session.updateLogIn(false);
        $scope.loggedIn = false;
    }
}])

//In Login.cshtml file:
<form id="frmLogin" class="form-inline search-box" data-ng-controller="LoginCtrl" ng-submit="login(userName, password)">
<div data-ng-hide="loggedIn">
    <input id="UserName" ng-model="userName" type="text" placeholder="Username or Email" required autofocus />
    <input id="Password" ng-model="password" type="password" placeholder="Password" required />
    <button type="submit" ng-disabled="!(userName && password)" disabled>Sign In</button>
</div>
<div data-ng-show="loggedIn">
    <a href="#" style="color:white;">Sign out</a>
</div>

//In Index.cshtml file:
<div data-ng-controller="HomeCtrl">
<div data-ng-show="loggedIn">
    <p>This should show when the user is logged in</p>
</div>

【问题讨论】:

  • 你错过了return之前的session.loggedIn;

标签: javascript asp.net angularjs


【解决方案1】:

乍一看,$watch 有问题,该函数应该返回一个值!下次请提供一个plunker!

    $scope.$watch(
    function () {
        return session.loggedIn;
    },

【讨论】:

  • 哇!那太快了!在某一时刻,我知道我在那里有“退货”声明。不知道怎么去掉的。我改变了它,它就像一个魅力。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
相关资源
最近更新 更多