0

我有以下角度应用程序(JSFiddle):

HTML

<form data-ng-app="jsApDemo" data-ng-controller="loginCtrl">
    <label for="username">Username:</label>
    <input type="text" id="username" data-ng-model="username" />
    <br />
    <label for="password">Password:</label>
    <input type="password" id="password" data-ng-model="password" />
    <br />
    <button type="submit" data-ng-click="executeLogIn()">Log in</button>
    <br />
    <label for="authstatus">Authentication status:</label>
    <input type="text" id="authstatus" readonly value="{{ authStatus }}" />
</form>

这是一个简单的登录表单,当用户点击提交时,我想在控制器中执行一个功能loginCtrlloginCtrl调用进行实际身份验证过程的服务。

JavaScript

// the controller and its module
angular.module('jsApDemo', ['Core'])
.controller('loginCtrl', ['$scope', 'Connection', function ($scope, Connection) {
    $scope.authStatus = 'unauthenticated';

    $scope.executeLogIn = function () {
        $scope.authStatus = 'authenticating';

        Connection.sessionInitialize({
            username: $scope.username,
            password: $scope.password
        }, function (error, status) {
            if (!error) {
                /***************************
                 * THIS LINE IS THE CULPRIT
                 ***************************/
                $scope.authStatus = status;
            }
        });
    };
}]);

// the service and its module
angular.module('Core', []).service('Connection', function () {
    this.sessionInitialize = function (options, callback) {
        if (!options || !options.username || !options.password) {
            callback('Username, and password are mandatory', null);
            return;
        }

        setTimeout(function () {
            callback(null, 'authenticated');
        }, 1000);
    };
});

在 serviceConnection中,我使用了setTimeout(注意:setTimeout用作异步调用的占位符。我的原始代码没有setTimeout。它调用了第三方库中的异步函数。我无法用它来制作 JSFiddle call 包含在代码中。所以我用 a 替换了对该库的调用,setTimeout以演示代码的异步性质)。

当我尝试$scope从回调函数中访问Connection.sessionInitialize. 调试后我发现以下行不起作用:

/***************************
* THIS LINE IS THE CULPRIT
***************************/
$scope.authStatus = status;

这似乎是一个范围界定问题,但console.log($scope)此行之前的一个简单语句表明它$scope具有正确的值。但是,#authstatusvalue属性绑定到的文本框$scope.authStatus不会改变。

我究竟做错了什么?

4

2 回答 2

0

setTimeout是罪魁祸首,因为它运行回调,更新范围,但不运行摘要循环,这使得双向数据绑定工作。改用$timeout服务:

$timeout(function () {
    callback(null, 'authenticated');
}, 1000);
于 2015-08-09T09:51:51.273 回答
-1

感谢@RahilWazir,我想出了一个解决方案:

/***************************
* THIS LINE IS THE CULPRIT
***************************/
$scope.$apply(function () {
    $scope.authStatus = status;
});
于 2015-08-09T09:24:14.507 回答