Как добавить значение объекта $ scope в другой объект $ scope? (AngularJS) - PullRequest
0 голосов
/ 02 января 2019

Я беру данные из разных списков страниц sharepoint.Я называю эти списки с Factory .
Мой код считает, сколько элементов со статусом " Завершено " у каждого списка.
Мне нужно взятьзначения каждого из них в массив, но результатом всегда является null.
Вот мой пример:

    <script>
        var myApp = angular.module("myApp", []);
        myApp.factory("myFactory", ["$http", function($http) {
            return {
                siteOne: function() {
                    return $http({
                        method: "GET",
                        url: "siteURL/_api/web/lists/getByTitle('List 1')/items",
                        headers: {"Accept": "application/json; odata=verbose"}
                    });
                },
                siteTwo: function() {
                    return $http({
                        method: "GET",
                        url: "siteURL/_api/web/lists/getByTitle('List 2')/items",
                        headers: {"Accept": "application/json; odata=verbose"}
                    });
                }
            }
        }]);
        myApp.controller("myController", function($scope, $http, myFactory) {
            myFactory.siteOne().success(function(data, status, headers, config) {
                $scope.projects = data.d.results;
                var items = $scope.projects,
                    totalItems = 0;

                for (var i=0;i<items.length;i++) {
                    var currentItem = items[i];
                    if(currentItem.Status!="Completed") {
                        totalItems++;
                    }
                };
                $scope.oneItems = totalItems;
            });

            myFactory.siteTwo().success(function(data, status, headers, config) {
                $scope.projects = data.d.results;
                var items = $scope.projects,
                    totalItems = 0;

                for (var i=0;i<items.length;i++) {
                    var currentItem = items[i];
                    if(currentItem.Status!="Completed") {
                        totalItems++;
                    }
                };  
                $scope.twoItems = totalItems;
            });

            $scope.data = [
                $scope.oneItems, $scope.twoItems
            ];

            console.log(JSON.stringify($scope.oneItems));
            console.log(JSON.stringify($scope.twoItems));
            console.log(JSON.stringify($scope.data));
        });
    </script>

Если я хочу напечатать каждое значение отдельно, оно показывает значения!Но если я попытаюсь поместить их в массив, он отобразит значения как «нулевые»:

3
5
[null, null]

Почему это происходит и как я могу это исправить?... я что-то не так делаю?

ОБНОВЛЕНИЕ КОДА
Вот мой код, уже работающий для тех, кто хотел бы его увидеть.Я изменил контроллер как Сергей Мелл sugested, используя $ q , также я использую AngularJS v1.7.5 (как georgeawg sugested):

myApp.controller("myController", function($scope, $http, myFactory, $q) {

            $q.all([
                myFactory.siteOne().then(response => {
                    var items = response.data.d.results,
                        totalItems = 0;

                    for (var i=0;i<items.length;i++) {
                        var currentItem = items[i];
                        if(currentItem.Status!="Completed") {
                            totalItems++;
                        }
                    };
                    $scope.oneItems = totalItems;
                }),
                myFactory.siteTwo().then(response => {
                    var items = response.data.d.results,
                        totalItems = 0;

                    for (var i=0;i<items.length;i++) {
                        var currentItem = items[i];
                        if(currentItem.Status!="Completed") {
                            totalItems++;
                        }
                    };  
                    $scope.twoItems = totalItems;
                })
            ]).then(function() {
                $scope.data = [
                    $scope.oneItems, $scope.twoItems
                ];

                console.log(JSON.stringify($scope.data));
            });
        });

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Также присваивайте значения клавише, например:

$scope.data = [
dataItemOne: $scope.oneItems, 
dataItemTwo: $scope.twoItems ];
0 голосов
/ 02 января 2019

У вас есть лучший вариант, поскольку @Sergey Mell, приведенный ниже, использует службу $ q.
Если вы не хотите использовать $ q.затем
Объявите $ scope.data = [];вверху и используйте
$ scope.data.push ($ scope.oneItems)
Но убедитесь, что вы объявили $ scope.data для [] вверху, иначе это вызовет ошибку.
код вашего контроллера будет выглядеть как

  myApp.controller("myController", function($scope, $http, myFactory) {
        $scope.data = [];
        myFactory.siteOne().success(function(data, status, headers, config) {
            $scope.projects = data.d.results;
            var items = $scope.projects,
                totalItems = 0;

            for (var i=0;i<items.length;i++) {
                var currentItem = items[i];
                if(currentItem.Status!="Completed") {
                    totalItems++;
                }
            };
            $scope.oneItems = totalItems;
           $scope.data.push($scope.oneItems);
        });

        myFactory.siteTwo().success(function(data, status, headers, config) {
            $scope.projects = data.d.results;
            var items = $scope.projects,
                totalItems = 0;

            for (var i=0;i<items.length;i++) {
                var currentItem = items[i];
                if(currentItem.Status!="Completed") {
                    totalItems++;
                }
            };  
            $scope.twoItems = totalItems;
             $scope.data.push($scope.twoItems );
        });

      /*  $scope.data = [
            $scope.oneItems, $scope.twoItems
        ];*/

        console.log(JSON.stringify($scope.oneItems));
        console.log(JSON.stringify($scope.twoItems));
        console.log(JSON.stringify($scope.data));
    });
0 голосов
/ 02 января 2019

Вы помещаете свои данные до того, как запросы были выполнены.Вы должны ждать до конца обоих запросов.Я бы предложил использовать Promise.all или $q.all, что более естественно для AngularJS, то есть:

myApp.controller("myController", function($scope, $http, myFactory, $q) {
        $q.all([
           myFactory.siteOne().then(/* Your stuff here */), 
           myFactory.siteTwo().then(/* Your stuff here */), 
        ]).then(function() {
           $scope.data = [
             $scope.oneItems, $scope.twoItems
           ];
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...