在这个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>
答案 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