`ng-show`调用函数不起作用

时间:2016-07-03 06:17:58

标签: angularjs

在这个PLUNK中,我有一个带有ng-show元素的div,它调用一个返回false的show()函数。因此,我希望不显示div。

另外,请注意show()函数被调用两次(console.log显示sh变量两次)。如何解决这个问题?

的Javascript

var app = angular.module('app', []);

app.directive('mydir', function ($compile) {

    var directive = {};

    directive.restrict = 'EA';

    directive.scope = {
         control: '='
    };

    directive.template = '<div id="root"></div>';

    directive.link = function (scope, element, attrs) {

      var sh = false;     
      var wrap = angular.element('<div id="wrap" ng-show="show()"></div>');
      wrap.attr('sh', sh);  
      var wrapc = $compile(wrap)(scope)
      element.append(wrapc); 

      scope.show = function() {
        var elem = angular.element( document.querySelector( '#wrap' ) );
        var sh = elem.attr('sh');
        console.log(sh); // <-- should log false only once, not twice
        return sh;
      }


    };

    return directive;

});

HTML

<mydir></mydir>

1 个答案:

答案 0 :(得分:1)

显示div的原因是因为您从sh读取attr值,并且这样做会成为字符串。

wrap.attr('sh', sh);

此行实际上将属性sh设置为"false"(字符串)而不是false。然后get函数elem.attr('sh');"false"作为字符串返回。并且一个非空字符串在javascript中是真实的,因此它的计算结果为真。

替换:

 var sh = elem.attr('sh');

使用字符串比较:

 var sh = (elem.attr('sh') == "true");

它应该有效

该节目被调用两次是预期的行为。在这里查看详细信息: Controller function getting called twice using ng-show