Как изменить var из функции в js

#angularjs #global-variables

#angularjs #глобальные переменные

Вопрос:

Я хочу изменить var в js в соответствии с приведенным ниже кодом:

  <script type="text/javascript">

        var dataRes;
        ersalvetabeApi()

        function ersalvetabeApi() {
            $.ajax({
                url: '/Api/Test',
                type: 'GET',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                success: function (data, textStatus, xhr) {
                    //  dataRes=data[0]
                    dataRes = data;
                    console.log(data[0]);
                },
                error: function (xhr, textStatus, errorThrown) {
                    console.log('Error in Operation');
                }
            });
        }

        var myApp = angular.module('myApp', []);
        myApp.controller('TestCtrl', ['$scope', '$window', function ($scope, $window) {
         //this.array = $window.dataRes;
            this.array = $window.dataRes;

        }]);
    </script>  

Когда я использую этот код, этот код не работает. Но когда я использовал alert(datares) ersalvetabeApi() эту работу. Я не хочу использовать alert.

Пожалуйста, помогите решить эту проблему. Заранее спасибо.

Ответ №1:

Вы выполняете асинхронный вызов сервера, но запускаете приложение angular синхронно, поэтому, когда вы достигнете кода angular, значение переменной window еще не присвоено.

 var dataRes;
ersalvetabeApi().then(function () {
    var myApp = angular.module('myApp', []);
    myApp.controller('TestCtrl', ['$scope', '$window', function ($scope, $window) {
    //this.array = $window.dataRes;
    this.array = $window.dataRes;
    }]);
});

function ersalvetabeApi() {
  return $.ajax({
    url: '/Api/Test',
    type: 'GET',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (data, textStatus, xhr) {
        //  dataRes=data[0]
        dataRes = data;
        console.log(data[0]);
    },
    error: function (xhr, textStatus, errorThrown) {
        console.log('Error in Operation');
    }
  });
} 
  

Попробуйте обернуть свой код, который должен вызываться после данных, возвращенных из вызова ajax. Теперь он будет выполняться асинхронно.

Комментарии:

1. Не удается прочитать свойство ‘then’ из undefined , эта ошибка возникает

2. спасибо за ответ Микки 🙂 но для меня это не работает! выдает ту же ошибку: не удается прочитать свойство ‘then’ неопределенного

3. Не могли бы вы создать plunker, и я решу это за вас!

4. я не знаю, что это такое, но я очень благодарен за ответ

Ответ №2:

наконец-то я могу это решить. может понадобиться всем. мой код:

    var myApp = angular.module('myApp', []);
            myApp.factory('valueService', function ($interval) {
                var service = {
                   ue: "hjk",
                };

                return service;
            });



            myApp.controller('SomeController', function ($scope, $interval, valueService) {
               

               // start();      // this line will execute when constructor initiates, starting the whole thing.
                // valueService.value = "45356";
                start();

                function start() {
                        $interval(function () {
                            $.ajax({
                                url: '/Api/Test',
                                type: 'GET',
                                contentType: 'application/json; charset=utf-8',
                                dataType: 'json',
                                success: function (data, textStatus, xhr) {
                                    //  dataRes=data[0]
                                    dataRes = data;
                                    valueService.ue = data;
                                    console.log(valueService.ue[0].id);
                                },
                                error: function (xhr, textStatus, errorThrown) {
                                    console.log('Error in Operation');
                                }
                            });
                        }, 1000,2);
                }
            });


            myApp.controller('TestCtrl', function ($scope, valueService) {
                $scope.message = 'Another Controller';
                $scope.valueService = valueService;
               // this.array = valueService;
            });  
  <div ng-controller="SomeController">
        </div>
        <hr />
        <div ng-controller="TestCtrl as ctrl">
            <span ng-repeat="entry in valueService.ue track by $index">
                {{ entry.name }} "/"
            </span>
            {{message}}
        </div  

Удачи