【问题标题】:Returning a JSON or any value from an anonymous function - AngularJS从匿名函数返回 JSON 或任何值 - AngularJS
【发布时间】:2018-08-16 12:58:31
【问题描述】:

在以下代码中,我返回调用服务器方法“getUserNames()”,该方法返回 JSON 并将其分配给 main.teamMembers 变量。我正在构建的报告中有一个 viewAll 按钮,该按钮调用下面列出的方法“$scope.viewAllTeamMembers = function($event)”。
现在,查看所有按钮列出了存储在 main.teamMembers 中的所有值,在第一次加载报表时不起作用。但是当我导航到报告中的其他按钮并尝试访问 viewAll 它的工作时。
我询问从匿名返回 JSON 的原因是,我发现当它是一个全局变量时,viewAll 按钮第一次起作用。请帮助我了解我所缺少的。

angular.module('kamApp')
    .controller('MainCtrl', [
        '$q',
        '$rootScope',
        '$scope',
        '$timeout',
        'endpoints',
        'kamService',
        'queries',
        'translations',
        function($q, $rootScope, $scope, $timeout, endpoints, kamService, queries, translations) {

            var getUserNamesRequest = endpoints.getUserNames($rootScope.teamMemberIds).then(function(userDdata){
                return userDdata;
            });

            getUserNamesRequest.then(function(userDdata,$scope)  {

                $rootScope.userNameList = kamService.extractUserNameList(userDdata);

                main.teamMembers=kamService.concatTeamMemberName(
                    main.teamMembersData,
                    $rootScope.userNameList.list
                );

                main.teamMembers.list = kamService.sortList(main.teamMembers.list, 'role', 'name');  

            });
    }]);

--Directive

    angular.module('kamApp')
    .directive('teamMember', function() {

        return {
            templateUrl: 'views/team-member.html',
            replace: true,
            restrict: 'E',
            scope: {
                teamMembers: '=',
                viewSwitch: '=',
                changeReportTitle: '&'
            },
            link: function($scope) {

                $scope.itemLimit = 4;

                $scope.isOddLength = $scope.teamMembers.list.length % 2 !== 0;

                $scope.viewAllTeamMembers = function($event) {
                    $event.target.style.opacity = 0.6;
                    $scope.viewSwitch.dashboard = false;
                    $scope.viewSwitch.teamMember = true;
                    $scope.changeReportTitle()($scope.teamMembers.objectName.plural);
                };
            }
        };
    });

--HTML代码

 "<div class=\"expand-link inline-block-div\" ng-click=\"viewAllTeamMembers($event)\"> \n"+

【问题讨论】:

  • 请不要像这样更新问题。请回滚编辑并提出另一个问题。

标签: javascript angularjs json anonymous-function


【解决方案1】:

在示例 1 中,您将 usernames 设置为 getUserNames().then() 返回的承诺,而不是返回值,并且 JSON.stringify(userNames); 在 AJAX 请求完成之前运行。

在示例 2 中,JSON.stringify(userNames); 再次在 AJAX 请求完成之前运行。

您应该将依赖于 result 的代码放在 then 回调中。

var result={};

getUserNames($rootScope.teamMemberIds).then(function(userDdata){
    result = userDdata;
    // Code dependent on result
});

如果你想运行其他依赖于被设置变量的代码

var result={};

var getUserNamesRequest = getUserNames($rootScope.teamMemberIds).then(function(userData){
    result = userData;
    // Code dependent on result

    // return the data so that chained promises get the original data.
    return userData;
});

// Other code dependent on `result` being set.
getUserNamesRequest.then((userData) => {
    // use either `result` or `userData` here.
});

【讨论】:

  • Phuzi 感谢您的建议。我能够执行取决于结果的代码,但在我的情况下,我想在函数之外使用它,即我想将结果分配给全局变量。
  • 这样做没有问题,你只需要确保任何访问变量的东西都等到AJAX响应完成。查看更新的答案。
  • @phuki 我已经尝试了上面的代码,但同样的问题仍然存在。我想全局存储结果。在下面的方法中,我们只能在函数内部使用结果或 userData。 ` // 其他代码依赖于设置的result。 getUserNamesRequest.then((userData) => { // 在此处使用resultuserData。});`
  • @aravindswamy 数据存储在“全局”变量中。您遇到的问题是直到之后 AJAX 请求完成后才可用,保证它可用的唯一方法是将promise 与then() 一起使用。如果您足够幸运,它可以在 ajax 请求完成后运行 ,它可以与 Promise 链之外的代码一起使用
  • @phuki 感谢您提供的信息,您说得对,它需要时间才能完成。我检查了网络统计信息,发现返回 JSON 的服务器方法。我已经更新了我正在处理的代码,希望你能看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多