Angular路线不会单击,但再次单击是有效的

时间:2016-02-15 08:08:08

标签: javascript angularjs asynchronous routing ngroute

我有一个数据服务,它将处理我所有与数据相关的操作,所有这些操作都是异步的。

点击ERASE按钮后,有一个功能会删除所有数据并返回包含操作状态的对象(成功:真/假)。

基于此值(TRUE),我需要路由到另一个视图(Say Data Successfully erased page)。

但是当我第一次点击按钮时没有发生路由(但是擦除功能正在给出正确的值(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>

任何帮助表示赞赏。 THANKYOU

2 个答案:

答案 0 :(得分:1)

您必须致电$scope.$digest()以通知角度已发生变化。我建议使用$q promise库中的angular而不是jquery promises:

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

答案 1 :(得分:1)

karaxuna提供的答案是对的。这是答案的延伸。

如果我在下面这样做,这将在一个中返回所有4个承诺。所需的数据是 appdata.msgs ,它位于每个承诺内(d。$$状态内)。

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

默认情况下,所有函数都将返回延迟对象。但我想明确地返回 appdata.msgs 。所以现在我需要4个函数来返回数据而不是延迟。

为实现这一目标,我将在四个函数的每个函数中使用 appdata.msgs (最后也返回相同的内容)来解决这个问题。

现在所有()函数将在所有这些函数解析后返回 appdata.msgs (请记住我已使用 appdata.msgs 解决)。

代码如下:

&#13;
&#13;
 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;
  
         });
&#13;
&#13;
&#13;

如果我的理解是错误的,请纠正我。 三江源。