Угловая функция запускается при нажатии, но не при инициализации в контроллере

0

Используя угловой, у меня есть функция, которая при подключении к кнопке (ng-click) в представлении работает, как ожидалось. Например, это выполняется и выполняет мою функцию при нажатии:

<button ng-click="foo()">add Foo!</button>

Тем не менее, я хотел бы обойти это, чтобы нажать эту кнопку, чтобы запустить функцию. Поэтому в моем контроллере я добавил:

foo();

Это не выполняло мою функцию и не использовало ng-init в представлении, как таковое:

<div ng-init="foo()"></div>

Я уверен, что мой код не выполняется, потому что он предназначен для записи в базу данных. При щелчке я вижу ожидаемые результаты в моем журнале консоли сервера, и данные записываются в базу данных. Используя вышеуказанные функции, журнал консоли сервера не получает ответа, и новые данные не записываются в базу данных.

Edit: Здесь моя функция, которая отправляет сообщение на мой сервер:

$scope.foo = function() {
    var SOName = $scope.bar.SO;
    var len = $scope.bar.FP.length;
    for(x=0;x<len;x++){
        $http.post('/track', {"track":$scope.bar.FP[x].name, "project":$scope.bar.SO}).success(function(response) {
    console.log(response);
  });
};};

где

$scope.bar =
{"SO":"Do xx","QT":0,"RG":[{"name":"yy","LOE":0,"QT":0}],"FP":[{"name":"zz","LOE":3,"QT":0},{"name":"bb","LOE":1,"QT":0},{"name":"ff","LOE":1,"QT":0}],"VP":[],"QC":[{"name":"ww","LOE":15,"QT":0}],"ED":[{"name":"ee","LOE":0,"QT":0}]}

При попытке вручную запустить эту функцию я изменил $scope.foo на var foo и добавил foo(); для запуска функции.

Edit: Пробовал просто называть {{foo()}} в представлении - это было довольно сложно. Страница будет либо зависать при загрузке, либо повторно отправлять пост после сообщения того же самого.

4 ответа

0

Чтобы обойти это, я просто добавил setTimeout:

setTimeout(function() { $scope.foo() },4000);

Четыре секунды дают зависимой функции достаточно времени для загрузки.

0

Попробуйте перезаписать функцию foo() чтобы иметь следующий пост http в цикле for:

    var postdata = {"track":$scope.bar.FP[x].name, "project":$scope.bar.SO},
            req = {
                    method: 'POST',
                    url: '/track',
                    headers: {
                        'Content-Type': "application/x-www-form-urlencoded; charset=utf-8"
                    },
                    data: $.param(postdata)
                };

    $http(req).success(function(data, status, headers, config){
        console.log(data); 
    }).error(function(data, status, headers, config){
            alert("error"+res);
    });

Я просто убедился, что у вас есть правильный заголовок Content-Type и используется $.param() для подготовки данных. Кроме того, я добавил обработчик ошибок для HTTP-запроса, который позволяет вам понять, почему сообщение не работает.

  • 0
    Спасибо, что написали это. Я не смог сделать прямое копирование и вставку в цикл for , но это может быть связано с тем, как мой сервер node.js обрабатывает записи. Он использует requestify для запуска сообщений. Я мог бы интегрировать код, но кажется, что то, что я пытаюсь сделать, должно быть возможно довольно просто через угловую.
0

Вот рабочий Plunk о том, как сделать функцию foo() выполняемой на странице/загрузке контроллера:

http://plnkr.co/edit/acmJXYpzFZx39GYoOGIW?p=preview

На plunk просмотрите IndexCtrl.js, он содержит примеры при вызове foo() как часть $scope, как локальную function() контроллера function(), а также с помощью встроенного тега ng-init.

Надеюсь, это поможет!

0

Вот некоторый код, который запускает функцию из контроллера

angular
  .module('myApp', [])
  .controller('ctrl', function() {
    var vm = this;
    vm.check = false;

    vm.f = function() {
      vm.check = true;
    }

    vm.f();
  });
<div ng-app="myApp">
  <div ng-controller="ctrl as c">
    {{c.check}}
  </div>
</div>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню