隔离范围指令:angularjs

问题描述:

我创建了一个指令隔离范围指令:angularjs

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

我曾尝试使用范围$手表和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); 

       }; 
}]); 

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

+0

您需要通过form。$ valid和administrator从modalFooter? – PSL 2014-09-02 19:02:12

+0

即时传递控制器属性administrator.loading = true我设置为false当我得到ajax结果,所以这个属性在控制器中得到改变,但我的指令没有看到变化,并且没有反应它甚至我已经使用attrs $ observe – Salman 2014-09-02 19:05:33

+0

Where is你的ajax和你设置为false的地方?当你点击'save'('ng-click =“onSave()”')你看到你的控制器的'save'函数没有得到任何参数吗? – PSL 2014-09-02 19:06:46

您的问题可能是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您可以链接通过他们和更新范围变量在那里,你将不再需要在超时中包装它。

+0

这只是为了测试的目的我已经使用承诺和阿贾克斯我已经定义了其他服务和回拨称为当承诺得到解决。谢谢你帮助我 – Salman 2014-09-02 20:27:42

+0

当然,你可以改为'administratorService.updateAdministrator()。然后(回调)'你应该很好。:) – PSL 2014-09-02 20:29:48