【问题标题】:How to access $scope variable declared in service callback function in ng-init or ng-checked如何访问在 ng-init 或 ng-checked 的服务回调函数中声明的 $scope 变量
【发布时间】:2016-08-05 12:21:29
【问题描述】:

我有在其中进行身份验证的 service.js。成功时从 controller.js 执行服务回调函数

service.js:

 'use strict';
 angular.module('Authentication')
.factory('AuthenticationService', ['$http', '$cookieStore', '$rootScope','$timeout', '$location', '$window',
function ($http, $cookieStore, $rootScope, $timeout, $location, $window) {
        var service = {};


        service.Login = function (username, password, callback) {

            $http.post('..json', {
                    headers: {
                        username: username,
                        password: password
                    }
                })
                .success(function (data, status, headers, config) {
                    $timeout(function () {
                        callback(status);

                    }, 1000);
                });
        };
        return service;
}])

controller.js:

 'use strict';
angular.module('Authentication').controller('LoginController', ['$scope', '$rootScope', '$location', 'AuthenticationService', '$http', '$timeout', '$window',
function ($scope, $rootScope, $location, AuthenticationService, $http, $timeout, $window) {

**$scope.name=true;**  
        $scope.login = function () {
            AuthenticationService.Login($scope.username, $scope.password, function (response) {
                if (response === 'Success') {
                    $http.get('..json').success(data,status,headers,config){
                   **$scope.value=true;**
                  })

                } else {
                    alert("Error");
                }
            });
        };
}]);

HTML:

我有 2 个复选框与来自 controller-$scope.name 和 $scope.value 的两个 $scope 变量相关联

  <input type="checkbox" ng-checked="name"> abc
  <input type="checkbox" ng-checked="value">xyz

现在由于两个 $scope 变量都设置为 true 两个复选框最初都应该被选中......但是带有 $scope.name 的复选框被选中并且 $scope.value 未被选中

关于为什么会发生这种情况以及如何使第二个复选框也最初根据 $scope.value 进行检查的任何想法

【问题讨论】:

  • 你说“两个$scope变量都设置为true”,但是我看到的方式,$scope.value只有true才表示登录成功,对吧?
  • 是的..没错,所以登录后应该选中复选框对吗?但登录后未选中..这些复选框在登录后显示的html文件中
  • 也许登录没有通过。如果您希望它们最初都被检查,请在 $scope.name=true 之后移动“$scope.value=true”
  • 实际上登录成功,在 $scope.value 中我需要一个从 $http 响应中得到的值,所以无法移出,登录后我会得到值 true/false,实际代码:: $scope.value=response.visible
  • 离题但我认为仍然有用。当它随着更多功能等变得更大时,如果您使用承诺而不是回调,您会发现管理和扩展要容易得多。您的示例中已经有一个嵌套的 $http 调用。使用 Promise,您可以将其展平,并将您的 Promise 链接起来,几乎不需要嵌套。

标签: javascript angularjs


【解决方案1】:

here 是一个与您的原始代码几乎完全相同的工作版本,我看到的唯一可能是错误的是if (response === 'Success'),因为在我的示例代码中,.success(data,status,headers,config) 中的status 是一个数字而不是字符串喜欢“成功”,也可以查看这个官方文档here

【讨论】:

  • if(response=== 'success' ) 确实像它内部的其他东西一样工作,只是这个 $scope 变量在 ng-init 或 ng-checked 中是不可访问的
  • 您是否尝试在 $scope.value 分配后对其进行控制台记录?它在控制台中返回正确的值吗?
  • 是的,它在控制台中返回正确的值...它在 js 中工作正常...甚至警报显示正确的值
  • 然后试试这个,把$scope.value=true;改成$scope.$apply(function () {$scope.value=true;});
  • 这可能是当您更改$scope 中的值时,它没有触发摘要循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
相关资源
最近更新 更多