【问题标题】:isolated scope directive doesnt react to change : angularjs隔离范围指令对更改没有反应:angularjs
【发布时间】:2014-09-02 18:52:16
【问题描述】:

我已经创建了一个指令

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 它不会停止加载图标。这意味着它不会对变化做出反应

我尝试使用 scope.$watch 和 attrs.$observe 但问题在于它在开始时开始显示加载图标并且它没有回到手表中: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);

                };
}]);

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

【问题讨论】:

  • 需要从modalFooter传入form.$valid和administrator?
  • 我正在传递控制器属性 administrator.loading = true,当我得到 ajax 结果时我设置为 false,所以这个属性在控制器中被更改,但我的指令没有看到更改,即使我使用过也没有反应attrs.$observe
  • 你的ajax在哪里以及你设置为false的地方?此外,当您单击 save(ng-click="onSave()") 时,您是否看到您的控制器 save 函数没有得到任何参数?
  • 但是你确定在你的指令第一次起作用时你会得到loading值吗?
  • 您需要使用$timeout 而不是setTimeout('AdminstratorController', ['$scope','$timeout', function ($scope, $timeout) {$timeout(function () {administratorService.updateAdministrator(callback);}, 1000); 当您更新 setTimeout 内部的某些内容时,Angular 直到下一个摘要周期发生时才知道它。如果你使用$timeoutdigest 循环就会发生。另外,您的 ajax 调用看起来如何,为什么需要 1 秒的超时?您没有使用 $http 吗?

标签: javascript angularjs angularjs-scope


【解决方案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 返回一个(角度)承诺,你可以链接它们并更新你的范围变量在那里,您将不再需要将其包装在超时中。

【讨论】:

  • 这只是为了测试目的,我使用了 Promise,而对于 ajax,我已经定义了其他服务,并在承诺得到解决时回调。谢谢你帮助我
  • 当然。你可以改为administratorService.updateAdministrator().then(callback) 你应该很好。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2013-03-15
相关资源
最近更新 更多