确保 Ionic Angular UI 在启动处理器密集型任务之前已重绘

Ensure Ionic Angular UI has redrawn before kicking off processor intensive task

本文关键字:任务 密集型 处理器 Angular Ionic UI 启动 确保      更新时间:2023-09-26

我在离子框架中有一个角度应用程序,它有一个加密的数据库。打开数据库的步骤是一项密集型任务。(在典型设备上长达 6000 毫秒)。

我在页面上有一个Login按钮,它在控制器中设置了一个标志"Data.Loading = true"。

在页面上的ng模板中有一个块

<div ng-show="Data.Loading">Please Wait</div>

"登录"的代码如下:

    $scope.Login = function() {
        if ($scope.IsCorrect($scope.Data.Password)) {
           $scope.Data.Loading = true;
           $scope.OpenAndContinue();
        }
    }
    $scope.OpenAndContinue = function(){
        MyDatabase.open().then(function() {
             $scope.Data.Loading = false;
             $rootScope.Display.Menu = true;
             $ionicHistory.nextViewOptions({
                  disableAnimate: true,
                  disableBack: true,
                  historyRoot: true
             });
             $state.go("app.home")
        })
    }

上述问题在于 UI 的响应速度不是特别快。在此页面上。 事实上,它非常慢 - 特别是与应用程序中的许多其他按钮相比。

视图需要一两秒钟才能更新并说"请稍候",然后再过几秒钟才能实际完成打开数据库。

如果我接受打开加密数据库的核心功能足够复杂,以至于无法快速打开,我至少希望视图能够立即响应用户的点击,以便让他们知道那东西没有坏。

我已经尝试了许多不同的已发布的角度修复。

    $scope.Login = function() {
        if ($scope.IsCorrect($scope.Data.Password)) {
           $scope.Data.Loading = true;
           $timeout($scope.OpenAndContinue);
           //$timeout($scope.OpenAndContinue, 0, false);
           //$timeout($scope.OpenAndContinue, 250, false);
        }
    }
    $scope.Login = function() {
        if ($scope.IsCorrect($scope.Data.Password)) {
           $scope.Data.Loading = true;
           $scope.$evalAsync($scope.OpenAndContinue);
        }
    }
    $scope.Login = function() {
        if ($scope.IsCorrect($scope.Data.Password)) {
           $scope.Data.Loading = true;
            $ionicModal.fromTemplateUrl("templates/modals/login.html", {
                scope: $scope,
                animation: 'scale-in',
                backdropClickToClose: false,
                hardwareBackButtonClose: false
            })
            .then($scope.OpenAndContinue);
        }
    }

到目前为止,我尝试过的任何方法都没有提供我期望从按钮点击中获得的"响应能力"。也不是我在APP其他地方看到的活泼。

我还能做些什么来确保登录感觉"活泼"吗?

即使是模态也没有那种"啪啪"的感觉。

可悲的是 - 根据我提供的信息,答案似乎无法获得。

该函数$scope.IsCorrect包含对另一个函数的调用$rootScope.$broadcast('myapp.login')

APP中的其他地方有一个事件侦听器,它打开了数据库本身(因此在这几毫秒内处理器使用率翻了一番,并在上面代码中处理的$apply()更新之前运行。

我最终通过在打开数据库的代码中添加console.trace()命令来找到对"opendatabase"的额外调用。这使我能够在该时间点看到完整的堆栈跟踪,并确定导致性能问题的其他原因。

StackOverflow会惩罚用户删除问题,所以我决定不终止这个问答 - 希望有人能从中找到有用的东西。