Javascript AngularJS:ng show=";“用户”;假,ng show=";!!“用户”;真的?
我在当前范围内有一个用户,由我的当前控制器设置Javascript AngularJS:ng show=";“用户”;假,ng show=";!!“用户”;真的?,javascript,angularjs,Javascript,Angularjs,我在当前范围内有一个用户,由我的当前控制器设置 $scope.user = user; 基于此用户的存在选择性地显示/隐藏并不像我预期的那样工作,而是引发了异常 不起作用:ng show=“user” ng show发生了什么,导致ng show=“user”不真实 我使用的是来自的angular.1.2.6 引发异常: 如果我使用ng show=“user”,则在控制台中会出现以下异常: TypeError: Cannot convert object to primitive value
$scope.user = user;
基于此用户的存在选择性地显示/隐藏
并不像我预期的那样工作,而是引发了异常
不起作用:ng show=“user”
ng show发生了什么,导致ng show=“user”
不真实
我使用的是来自的angular.1.2.6
引发异常:
如果我使用ng show=“user”
,则在控制台中会出现以下异常:
TypeError: Cannot convert object to primitive value
at Ma (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:14:240)
at Object.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:185:464)
at Object.applyFunction [as fn] (<anonymous>:778:50)
at h.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:99:211)
at h.$delegate.__proto__.$digest (<anonymous>:844:31)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:101:256
at e (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:33:182)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:36:378
这个!!运算符基本上将JS对象转换为布尔值 请查看以下示例:
function myCtrl($scope) {
$scope.user = 'false';
$scope.boolean = !!$scope.user;
}
我们创建一个用户对象,例如包含字符串false,通过调用!!操作人员由于$scope.user的值不为null,因此!!运算符将其转换为true。但是,angular会将字符串“false”转换为布尔值false,从而隐藏div
我们可以通过以下方式对此进行测试:
<div ng-controller="myCtrl">
<div ng-show="boolean">
test boolean
</div>
<div ng-show="user">
test user
</div>
<span>{{boolean}}</span>
</div>
@编辑
因为我们讨论的是用户对象而不是字符串,正如您收到的错误消息所述,所以!!转换为布尔值(=原语)是否适合您。请记住,期望表达式求值,并将使用此函数“转换”为布尔值:
function toBoolean(value) {
if (typeof value === 'function') {
value = true;
} else if (value && value.length !== 0) {
var v = lowercase("" + value);
value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
} else {
value = false;
}
return value;
}
所以你不应该只使用一个对象。您可以继续使用
!!用户
或者可能是user.someattr
您可以提供一个失败的示例。似乎对我有用<代码>$scope.user正在Google+oauth2回调上设置,我无法在JSFIDLE/PLUNK上复制该回调etc@hassassin-在问题中添加了TypeError
例外:期望非null对象计算为truthy是否不安全?老实说,这是我第一次看到这个错误!谢谢-我没有意识到这一点!虽然它检查了非Null,但我想知道是否有必要进行额外的if(typeof value==='object')
检查?
function myCtrl($scope) {
$scope.user = 'false';
$scope.boolean = !!$scope.user;
}
<div ng-controller="myCtrl">
<div ng-show="boolean">
test boolean
</div>
<div ng-show="user">
test user
</div>
<span>{{boolean}}</span>
</div>
test boolean
true
function toBoolean(value) {
if (typeof value === 'function') {
value = true;
} else if (value && value.length !== 0) {
var v = lowercase("" + value);
value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
} else {
value = false;
}
return value;
}