Угловой маршрут не работает с одним щелчком мыши, но повторный щелчок работает

У меня есть служба данных, которая будет обрабатывать все мои операции, связанные с данными, и все эти операции являются асинхронными.

Как только я нажимаю кнопку ERASE, появляется одна функция, которая стирает все данные и возвращает объект, содержащий статус операции (Успех: true/false).

На основе этого значения (ИСТИНА) мне нужно перейти к другому представлению (страница «Данные успешно удалены»).

Но когда я нажимаю кнопку в первый раз, маршрутизация не происходит (но функция стирания дает правильное значение (true). Однако, если я снова нажимаю ту же кнопку, маршрут происходит.

Вот как я использую свою функцию removeDatabase() (часть dataService).

    self.removeDatabase = function () {
        //$location.path("/setup");
        dataService.resetDatabase().done(function (msgs) {
            if(msgs['Operation_success']){
                console.log("Operation is Success ? :"+msgs['Operation_success']);
                $location.path("/setup");
                //self.loadSetup();
            }
        });
    },

Вот функция внутри службы.

appdata.resetDatabase = function () {
        appdata.msgs = {};
        var deferred = jQuery.Deferred();
        appdata.db = window.openDatabase("finbud_db", "1.0", "FinBud", 20);

        var d1 = jQuery.Deferred();
        appdata.db.transaction(function (tx) {
            tx.executeSql('DROP TABLE IF EXISTS BASE_TABLE');
        }, function () {
            appdata.msgs['BASE_TABLE'] = "Could not Delete";
            appdata.msgs['Operation_success'] = false;
            d1.resolve();
        }, function () {
            appdata.msgs['BASE_TABLE'] = "Deleted";
            appdata.msgs['Operation_success'] = true;
            d1.resolve();
        });

        var d2 = jQuery.Deferred();
        appdata.db.transaction(function (tx) {
            tx.executeSql('DROP TABLE IF EXISTS CATEGORY_TABLE');
        }, function () {
            appdata.msgs['CATEGORY_TABLE'] = "Could not Delete";
            appdata.msgs['Operation_success'] = false;
            d2.resolve();
        }, function () {
            appdata.msgs['CATEGORY_TABLE'] = "Deleted";
            appdata.msgs['Operation_success'] = true;
            d2.resolve();
        });

        var d3 = jQuery.Deferred();
        appdata.db.transaction(function (tx) {
            tx.executeSql('DROP TABLE IF EXISTS ACCOUNTS_TABLE');
        }, function () {
            appdata.msgs['ACCOUNTS_TABLE'] = "Could not Delete";
            appdata.msgs['Operation_success'] = false;
            d3.resolve();
        }, function () {
            appdata.msgs['ACCOUNTS_TABLE'] = "Deleted";
            appdata.msgs['Operation_success'] = true;
            d3.resolve();
        });

        var d4 = jQuery.Deferred();
        appdata.db.transaction(function (tx) {
            tx.executeSql('DROP TABLE IF EXISTS TRANSACTIONS_TABLE');
        }, function () {
            appdata.msgs['TRANSACTIONS_TABLE'] = "Could not Delete";
            appdata.msgs['Operation_success'] = false;
            d4.resolve();
        }, function () {
            appdata.msgs['TRANSACTIONS_TABLE'] = "Deleted";
            appdata.msgs['Operation_success'] = true;
            d4.resolve();
        });

        jQuery.when(d1, d2, d3, d4).done(function () {
            deferred.resolve(appdata.msgs);
        });
        return deferred.promise();

    };

Наконец, HTML:

    <md-button  ng-click="appCtrl.removeDatabase();">
        <i class="mdi mdi-reload"></i> Reset App 
    </md-button>

Любая помощь приветствуется. Благодарю вас


person MKAka    schedule 15.02.2016    source источник


Ответы (2)


Вы должны вызвать $scope.$digest(), чтобы уведомить angular, что что-то изменилось. Я предлагаю использовать angular встроенную библиотеку обещаний $q вместо обещаний jquery:

var d1 = $q.defer();
...
d1.resolve();
...
return $q.all([d1, d2, d3, d4]).then(function () {
    return appdata.msgs;
});
person karaxuna    schedule 15.02.2016
comment
Привет Спасибо за ответ. Это решило мою проблему. Но в функции успеха я не получаю обещанные данные. - person MKAka; 15.02.2016
comment
Спасибо за быстрый ответ. Если я использую консоль dataService.resetDatabase() , я получаю объект обещания. (Конечно, у него есть $$state.value). Но я пытаюсь dataService.resetDatabase().then(function(data){}); путь. В этом случае я все еще становлюсь пустым. Что мне не хватает? - person MKAka; 15.02.2016
comment
@ManiKumarAkasapu отлаживает appdata.msgs в консоли - person karaxuna; 15.02.2016
comment
Он доступен в каждой функции. Но не внутри return().then() - person MKAka; 15.02.2016
comment
Большое спасибо karaxuna. Вышеупомянутая проблема - это нечто, не связанное с этим вопросом. Я понял решение. Еще раз спасибо. - person MKAka; 16.02.2016
comment
Я публикую решение, предполагая, что оно кому-нибудь поможет. - person MKAka; 16.02.2016

Ответ, предоставленный karaxuna, правильный. Это расширение для ответа.

Если я сделаю так, как показано ниже, это вернет все 4 обещания в одном. Требуемые данные — это appdata.msgs, которые находятся внутри каждого промиса (внутри d.$$state).

var d1 = $q.defer();
...
d1.resolve();
...
return $q.all([d1, d2, d3, d4]).then(function () {
    return appdata.msgs;
});

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

Для этого я разрешаю обещание с помощью appdata.msgs (также возвращая то же самое в конце) для каждой из четырех функций.

Теперь функция all() будет возвращать appdata.msgs после разрешения всех этих функций (помните, что я разрешил с помощью appdata.msgs).

Код ниже:

 function d1() {
   
   var d1 = $q.defer();
   
   ......
   //some where
   d1.resolve(msgs);
   .......
   
   return d1.promise;
}

................

 function dN() {
   
   var dN = $q.defer();
   
   ......
   //some where
   dN.resolve(msgs);
   .......
   
   return dN.promise;
}

return $q.all([d1(), d2(),  ....., dN()]).then(
  
         function () {
  
            return msgs;
  
         },
               
         function(){
  
            msgs['Operation_success'] = false;
            return msgs;
  
         });

Поправьте меня, если мое понимание неверно. Спасибо.

person MKAka    schedule 16.02.2016