How to check if a scope variable is undefined in AngularJS template?
Asked Answered
P

10

60

How to check if a scope variable is undefined?

This does not work:

<p ng-show="foo == undefined">Show this if $scope.foo == undefined</p>
Poole answered 20/11, 2014 at 15:0 Comment(2)
Welcome to StackOverflow! Please see "Should questions include “tags” in their titles?", where the consensus is "no, they should not".Lowell
Ah, I didn't think about the fact that you wouldn't have access to the "typeof" keyword in your template markup. Sorry about that. I've removed my close vote.Fda
S
69

Here is the cleanest way to do this:

<p ng-show="{{foo === undefined}}">Show this if $scope.foo === undefined</p>

No need to create a helper function in the controller!

Segal answered 2/5, 2015 at 20:52 Comment(3)
This is not reactive. Meaning when foo changes, ng-show does not change accordingly.Quartis
curly braces should not be used with ng-show as it expression only. Curly braces are used for evaluating an expression inside an otherwise string textLettered
I receive Error: [$parse:syntax] Syntax Error: Token '{' invalid key at ...Outdare
U
28

Using undefined to make a decision is usually a sign of bad design in Javascript. You might consider doing something else.

However, to answer your question: I think the best way of doing so would be adding a helper function.

$scope.isUndefined = function (thing) {
    return (typeof thing === "undefined");
}

and in the template

<div ng-show="isUndefined(foo)"></div>
Upright answered 20/11, 2014 at 15:11 Comment(2)
or you can use angular's helper function, angular.isUndefined(object) / angular.isDefined(object)Addicted
I would argue that not being able to handle an object with an undefined property is bad design front end code.Phionna
S
9

Corrected:

HTML

  <p ng-show="getFooUndef(foo)">Show this if $scope.foo === undefined</p>

JS

$scope.foo = undefined;

$scope.getFooUndef = function(foo){
    return ( typeof foo === 'undefined' );
}

Fiddle: http://jsfiddle.net/oakley349/vtcff0w5/1/

Stelmach answered 20/11, 2014 at 15:2 Comment(4)
You're right, didn't think of it that way. Editing answerStelmach
This is not correct either, since undefined is not a JavaScript keyword (it's a variable). See #7174273Fda
It is better practice to do return (foo === undefined); than return (typeof foo === 'undefined');.Jacindajacinta
@Stelmach Please note === operator itself check value and type as well. So you don't need to do complex code using typeof operatorVivacious
O
6

Posting new answer since Angular behavior has changed. Checking equality with undefined now works in angular expressions, at least as of 1.5, as the following code works:

ng-if="foo !== undefined"

When this ng-if evaluates to true, deleting the percentages property off the appropriate scope and calling $digest removes the element from the document, as you would expect.

Oatcake answered 20/3, 2017 at 21:23 Comment(0)
C
4

If foo is not a boolean variable then this would work (i.e. you want to show this when that variable has some data):

<p ng-show="!foo">Show this if $scope.foo is undefined</p>

And vise-versa:

<p ng-show="foo">Show this if $scope.foo is defined</p>

Coranto answered 5/12, 2016 at 0:6 Comment(0)
B
1

If you're using Angular 1, I would recommend using Angular's built-in method:

angular.isDefined(value);

reference : https://docs.angularjs.org/api/ng/function/angular.isDefined

Bithia answered 20/3, 2017 at 11:1 Comment(0)
Q
1

You can use the double pipe operation to check if the value is undefined the after statement:

<div ng-show="foo || false">
    Show this if foo is defined!
</div>
<div ng-show="boo || true">
    Show this if boo is undefined!
</div>

Check JSFiddle for demo

For technical explanation for the double pipe, I prefer to take a look on this link: https://mcmap.net/q/24491/-what-does-the-construct-x-x-y-mean

Quintessa answered 18/2, 2018 at 8:14 Comment(1)
Um, no, that's not an equivalent to check whether it is actually undefined. Your example will fail if boo variable is 0, null, false, or just an empty string.Valene
E
1

As @impulsgraw wrote. You need to check for undefined after the pipes:

<div ng-show="foo || undefined">
    Show this if foo is defined!
</div>
<div ng-show="boo || !undefined">
    Show this if boo is undefined!
</div>

https://jsfiddle.net/mjfz2q9h/11/

Eruption answered 5/6, 2019 at 13:23 Comment(0)
L
-1

try this angular.isUndefined(value);

https://docs.angularjs.org/api/ng/function/angular.isUndefined

Lengthways answered 3/2, 2020 at 9:29 Comment(0)
Y
-3

<p ng-show="angular.isUndefined(foo)">Show this if $scope.foo === undefined</p>

Yamauchi answered 20/5, 2015 at 18:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.