在某些情况下,无法使用angularjs更改$scope变量值

在某些情况下,无法使用angularjs更改$scope变量值,angularjs,monaca,Angularjs,Monaca,我正在使用angularjs和Monaca构建移动应用程序 我将此部分用于登录过程 $scope.login = function(username, password){ $scope.isLogging = true; $scope.loginMsge = ''; service.getUsernamePassword(username, password).then(function (response) { // try to connec

我正在使用angularjs和Monaca构建移动应用程序
我将此部分用于登录过程

$scope.login = function(username, password){
        $scope.isLogging = true;
        $scope.loginMsge = '';
        service.getUsernamePassword(username, password).then(function (response) { // try to connect to server data base
            if(typeof response == 'undefined'){ // there is no internet so check user and password from local data base
                console.log('local login');
                var db = window.openDatabase("Database", "1.0" , "TestDatabase" , 200000);
                db.transaction(function(transaction) {
                    transaction.executeSql("SELECT * FROM user_t WHERE username = ?;", [username], function(transaction, result) {
                        if (result.rows.length > 0) {
                            if(bcrypt.compareSync(password, result.rows[0].password) == true){
                                $scope.userLogin = true;
                                $scope.getProjects();// get projects to display them after login
                                myNav.pushPage('home.html')
                                $scope.isLogging = false;
                                console.log('login');
                            }else{ // user name and password is invalid
                                $scope.userLogin = false;
                                $scope.getProjects();// there is no need to this call here but the loginMsge will not displayed if I didn't do that
                                $scope.loginMsge = 'Invalid username and password';
                                $scope.isLogging = false;
                            }
                        }else{ // the user is not exist in data base
                            $scope.userLogin = false;
                            $scope.getProjects();
                            $scope.loginMsge = 'Invalid username and password ';
                            $scope.isLogging = false;
                        }
                    }, function(transaction, error) {
                        console.log('log failed '+error);
                    });
                });
            }else if(response.data.userLogin){
                console.log('Server login');
                $scope.userLogin = true;
                $scope.getProjects();
                myNav.pushPage('home.html');
                $scope.isLogging = false;
            }else{
                $scope.userLogin = false;
                $scope.loginMsge = 'Invalid username and password ';
                $scope.isLogging = false;
            }
        });
    }
首先,我尝试连接到服务器数据库以检查用户名和密码,若应用程序无法连接(并没有internet),我会检查本地数据库中的用户名和密码

如果用户名和密码无效,我想

$scope.userLogin = false;
 $scope.getProjects();// there is no need to this call here but the loginMsge will not displayed if I didn't do that
 $scope.loginMsge = 'Invalid username and password';
 $scope.isLogging = false;

如果用户名和密码正确,我想执行以下操作

 $scope.userLogin = true; // I know that user is successfully login
 $scope.getProjects();// get projects to display them after login
 myNav.pushPage('home.html')
 $scope.isLogging = false;// use this variable to display and hide circular progress
问题是,如果我没有调用函数getProjects(),消息将不会显示,范围变量也不会工作

我的控制器中的函数$scope.getProjects

$scope.getProjects = function(){
        localDBService.getProjects().then(function(result) {
            $scope.projects = result;
        });
    }
localDBService中的函数getProjects()

 function getProjects() {
        var deferred = $q.defer();
        var projects;
        var db = window.openDatabase("Database", "1.0", "TestDatabase", 200000);
        db.transaction(function(transaction) {
            transaction.executeSql("SELECT * FROM projects_t;", [], function(transaction, result) {
                if (result.rows.length > 0) {
                        deferred.resolve(JSON.parse(JSON.stringify(result.rows)));
                }
                // deferred.resolve(result);
            }, function(transaction, error) {
                deferred.reject(error);
            });
        });

        return deferred.promise;
    };
更新:这是我的观点

<ons-template id="login.html">
    <ons-navigator var="myNav">
        <ons-page>
            <ons-toolbar>
                <div class="left"></div>
                <div class="center">Log In</div>
                <div class="right"></div>
            </ons-toolbar>
            <ons-toolbar>
                <div class="center">Login Page</div>
            </ons-toolbar>

            <div style="text-align: center; margin-top: 30px;">
                <p>
                    <ons-input id="username" ng-model="username" modifier="underbar" placeholder="Username" float ng-model="page.username"></ons-input>
                </p>
                <p>
                    <ons-input id="password" ng-model="password" modifier="underbar" type="password" placeholder="Password" float ng-model="page.password"></ons-input>
                </p>
                <div style="display: table;margin: 0 auto; "><ons-progress-circular indeterminate ng-show="isLogging" ></ons-progress-circular></div>
                <p style="margin-top: 30px;">
                    <ons-button ng-click="login(username,password)">Sign in</ons-button>
                </p>
                <div style ="text-align:center; color: red;" >{{loginMsge}}</div>
            </div>

        </ons-page>
        <ons-modal var="modal_loading_login">
            <ons-icon icon="ion-loading-c" spin="true" ></ons-icon>
        </ons-modal>
</ons-template>

登录
登录页面

登录

{{loginMsge}}
这可能是由于变量未在
$scope
上触发重新渲染而导致的问题。使用
$scope.$apply()
代替函数调用,它应该可以工作

变量未更改或未在浏览器上显示更改是否有问题?如果您
console.log$scope.loginMsge更改后,它是否具有旧值或新值?如果它已更改但未显示,则可能是由于变量未触发$scope上的重新渲染。您可以尝试
$scope.apply()
而不是函数调用,看看它是否有效。您是对的,当我添加以下代码console.log('$scope.userLogin'+$scope.userLogin)时,显示问题不是值问题;log(“$scope.isLogging”+$scope.isLogging)$scope.apply();我发现变量值已更改,但我得到以下错误:“Uncaught TypeError:$scope.apply不是函数”对于异步进程,请使用
$scope.apply()
更新scope数据。当我添加$scope时,问题消失。$apply()不是$scope.apply()@groooves添加一个答案,以便我可以将其标记为已接受,谢谢