ng-hide没有动态更新

时间:2017-07-29 16:15:59

标签: javascript html angularjs google-maps ionic-framework

我在div元素下面有nghide

 <div ng-hide="showdiv" class="btnshowall"> 
    <a class="button button-block round outline"
       style="background: transparent !important;" >
      Show All
    </a>
 </div>

和控制器如下

.controller('mapCtrl', ['$scope', '$stateParams','User','$cordovaGeolocation','geoFireFac','GoogleMapFac','ConnectivityMonitor','PhysioFac','User',
function ($scope, $stateParams,User,$cordovaGeolocation,geoFireFac,GoogleMapFac,ConnectivityMonitor,PhysioFac,User) {

    console.log('called mapctrl');  
    GoogleMapFac.setUserLoc($scope.map);
    $scope.showdiv = User.getShowDiv();


}])

和用户服务

.service('User', ['ToastFac',function(ToastFac){
    return {
         showDiv : false,
        changeShowDiv : function(){
            console.log('in changeShowDiv before change '+this.showDiv);
            this.showDiv = !this.showDiv;
            console.log('in changeShowDiv after change '+this.showDiv);

        },

        getShowDiv : function(){
            return this.showDiv;
        }

我正在从谷歌地图的标记点击事件中调用User.changeShowDiv(),如下所示

google.maps.event.addListener(marker, 'click', function () {
      alert('store id '+marker.get('store_id'));
      if(User.showDiv){
          console.log('in if');
          User.changeShowDiv();
          console.log('User.showDiv '+User.showDiv);
      }
      else{
          console.log('in else');
          User.changeShowDiv();
          console.log('User.showDiv '+User.showDiv);
      }

});

日志按预期进行

in else
services.js:123 in changeShowDiv before change false
services.js:125 in changeShowDiv after change true
services.js:218 User.showDiv true
services.js:211 in if
services.js:123 in changeShowDiv before change true
services.js:125 in changeShowDiv after change false
services.js:213 User.showDiv false
services.js:216 in else
services.js:123 in changeShowDiv before change false
services.js:125 in changeShowDiv after change true
services.js:218 User.showDiv true

默认情况下,当User.showDiv变量为false时,showAll按钮可见。但按钮没有隐藏&amp;来自标记点击事件。

有人可以指导我缺少的东西。

2 个答案:

答案 0 :(得分:3)

来自AngularJS框架之外的事件需要通过$apply进入AngularJS框架:

google.maps.event.addListener(marker, 'click', function () {
      alert('store id '+marker.get('store_id'));
      if(User.showDiv){
          console.log('in if');
          User.changeShowDiv();
          console.log('User.showDiv '+User.showDiv);
      }
      else{
          console.log('in else');
          User.changeShowDiv();
          console.log('User.showDiv '+User.showDiv);
      }
      //IMPORTANT
      $scope.$apply();    
});
  

AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流程。这将JavaScript拆分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才会受益于AngularJS数据绑定,异常处理,属性监视等...您还可以使用$apply()从JavaScript进入AngularJS执行上下文。请记住,在大多数地方(控制器,服务)$apply已由处理事件的指令调用。只有在实现自定义事件回调时才需要显式调用$apply,或者在使用第三方库回调时

     

ff

     

— AngularJS Developer Guide - Integration with the browser event loop

ALSO

务必修复ng-hide和控制器:

<div ng-hide="showdiv()" class="btnshowall">
$scope.showdiv = function() {
    return User.getShowDiv();
};

在上面的代码中,ng-hide指令将在每个摘要周期执行showdiv()函数,并相应地更新元素的可见性。

答案 1 :(得分:1)

您仅从User.getShowDiv方法检索一次值。但是当它发生变化时,你不会更新showdiv范围变量。每次您可以将User.getShowDiv方法的引用直接绑定到showdiv范围变量(如下所示)时更新值

$scope.showdiv = User.getShowDiv; 

在HTML上调用showdiv方法之后,最终将评估每个摘要周期的值,而不像其他bindings

ng-hide="showdiv()"

即便如此也无法解决您的问题。基本上你是从外部上下文Angular更新一些变量,它是click事件。因此,您必须在更新click事件侦听器运行的值后立即手动运行摘要周期。只需使用$timeout(angular.noop)安全地解雇摘要周期。

google.maps.event.addListener(marker, 'click', function () {
      alert('store id '+marker.get('store_id'));
      if(User.showDiv){
          //Code here
      }
      else{
          //Code here
      }
      //manually triggering digest loop to make binding in sync
      $timeout(angular.noop); //It will run new digest cycle.
});