Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 服务异步更新值_Javascript_Angularjs_Angular Material - Fatal编程技术网

Javascript 服务异步更新值

Javascript 服务异步更新值,javascript,angularjs,angular-material,Javascript,Angularjs,Angular Material,我有一个对话框控制器: .controller('loadingDialogCtrl', function($scope, $mdDialog, $rootScope, loadingDialog) { $scope.loadingDialog = loadingDialog; }); 在我的另一个控制器中,我显示此对话框控制器,并通过加载DialogService对其进行操作: .controller('myCtr', function($scope, $mdDialog, load

我有一个对话框控制器:

.controller('loadingDialogCtrl', function($scope, $mdDialog, $rootScope, loadingDialog) {
    $scope.loadingDialog = loadingDialog;
});
在我的另一个控制器中,我显示此对话框控制器,并通过
加载DialogService
对其进行操作:

.controller('myCtr', function($scope, $mdDialog, loadingDialog) {
   $mdDialog.show({
       controller: 'loadingDialogCtrl',
       templateUrl: 'tmpl/loadingDialog.tmpl.html'
   });
   loadingDialog.status = "Formatting...";

})
加载对话框
服务:

angular.module('LoadingDialogService', []).service('loadingDialog', function ($mdDialog) {
    this.progress = 0;
    this.status = "Loading data from board...";
    this.additionalStatus = "";
    this.mode = "determinate";

    return {
        progress: this.progress,
        status: this.status,
        additionalStatus: this.additionalStatus,
        mode: this.mode
    }
});
这个很好用。但例如,如果我在异步函数中更改服务值,我的对话框视图不会更新:

//progress bar inside dialog have changed
loadingDialog.progress = 55;
setTimeout(function () {
    //progress bar inside dialog didn't change
    loadingDialog.progress = 55;
}, 10)

setTimeout()
超出angular的摘要周期,因此视图值不会更新。改用
$timeout()
。($timeout)

setTimeout()
超出angular的摘要周期,因此视图值不会更新。改用
$timeout()
。($timeout)

加载对话框Ctrl
中,而不是

$scope.loadingDialog = loadingDialog;
你应该使用

$rootScope.$watch(function() {
    return loadingDialog;
}, function(loadingDialogValue) {
    $scope.loadingDialog = loadingDialogValue;
}, true);
或者(更优雅的解决方案)


加载对话框中,按Ctrl
而不是

$scope.loadingDialog = loadingDialog;
你应该使用

$rootScope.$watch(function() {
    return loadingDialog;
}, function(loadingDialogValue) {
    $scope.loadingDialog = loadingDialogValue;
}, true);
或者(更优雅的解决方案)


值被100%更改,因为console.log(loadingDialog.progress)打印progress值更改,但摘要循环不会运行,这意味着HTML中的值不会更新。使用$timeout应该可以解决这个问题,除非还有其他问题。能否将对话框视图添加到帖子中?@Arti$timeout是正确的解决方案。考虑是否由于某种原因而不起作用。目前尚不清楚在您的案例中如何使用
loadingDialog
。值已100%更改,因为console.log(loadingDialog.progress)打印进度值更改-但摘要周期不运行,这意味着您的HTML中的值不会更新。使用$timeout应该可以解决这个问题,除非还有其他问题。能否将对话框视图添加到帖子中?@Arti$timeout是正确的解决方案。考虑是否由于某种原因而不起作用。不清楚在您的案例中如何使用
加载对话框