孤立的范围指令不会对变化作出反应:angularjs

时间:2014-09-02 18:52:16

标签: javascript angularjs angularjs-scope

我创建了一个指令

adocsModule.directive('modalFooter', function (globalService) {
    return {
        restrict: 'AE',
        replace: true,
        scope: {
            'onSave': '&',
            'onClose': '&',
            'loading': '='
        },
        template: '<div class="modal-footer">' +
                 ' <div class="pull-right">' +
                 '<button type="submit" ui-ladda="loading" class="button-save ladda-button" ng-click="onSave()" data-style="expand-right">' +
                 '<span class="ladda-label">{{saveText}}</span>' +
                 '</button>' +
                 ' <button class="button-cancel" ng-click="onClose()">{{cancelText}}</button>' +
                 ' </div> </div>',
        link: function (scope, element, attrs, ctrl) {

            scope.saveText = attrs.savetext;
            scope.cancelText = attrs.canceltext;
        }
    };
});

使用此

<modal-footer loading="administrator.loading" on-save="administrator.save()" on-close="administrator.cancel()"></modal-footer>
当我按下保存时,在我的控制器中

。 administrator.loading = true它显示加载图标,但在回调时我做administrator.loading = false它不会停止加载图标。这意味着它不会对变化作出反应

我曾尝试使用范围。$ watch和attrs。$观察但是开始时显示加载图标的问题却出现问题:S

Module.controller('AdminstratorController', ['$scope', function ($scope) {
administrator.save = function () {                   
                        administrator.loading = true;
                        var callback = function () { 
                           administrator.loading  false;                           
                        }

                            setTimeout(function () {
                                administratorService.updateAdministrator( callback);
                            }, 1000);

                };
}]);

有人可以指导我如何解决它。

1 个答案:

答案 0 :(得分:1)

您的问题可能是setTimeout,您正在更新setTimeout中的范围变量,它不会触发摘要周期,因此在下一个摘要周期发生之前您将看不到更新。在超时的角度版本中包含您的呼叫,即$timeout,使用它将在超时完成后触发摘要周期。

    Module.controller('AdminstratorController', ['$scope', '$timeout', function ($scope, $timeout) {
       administrator.save = function () {                   
            administrator.loading = true;
            var callback = function () { 
              administrator.loading  false;                           
            }

            $timeout(function () {
               administratorService.updateAdministrator( callback);
            });

        };
    }]);

在旁注上我不确定你在回调和使用超时时传递的是什么,如果你使用了承诺并从updateAdministrator返回(有角度)承诺,你可以链接它们并更新你的范围变量在那里,您将不再需要将它包装在超时中。