<ul data-bind="foreach: planets">
Planet: <b data-bind="text: name"> </b>
<div data-bind="if: capital">
Capital: <b data-bind="text: capital.cityName"> </b>
<script>
ko.applyBindings({
planets: [
{ name: 'Mercury', capital: null },
{ name: 'Earth', capital: { cityName: 'Barnsley' } }
</script>
It’s important to understand that the if
binding really is vital to make this code work properly. Without it, there would be an error when trying to evaluate capital.cityName
in the context of “Mercury” where capital
is null
. In JavaScript, you’re not allowed to evaluate subproperties of null
or undefined
values.
Parameters
Main parameter
The expression you wish to evaluate. For the if
binding, if it evaluates to true
(or a true-ish value), the contained markup will be present in the document, and any data-bind
attributes on it will be applied; if your expression evaluates to false
, the contained markup will be removed from your document without first applying any bindings to it. For the ifnot
binding, the behavior is reversed.
If your expression involves any observable values, the expression will be re-evaluated whenever any of them change. Correspondingly, the markup within your if
or ifnot
block can be added or removed dynamically as the result of the expression changes. data-bind
attributes will be applied to a new copy of the contained markup whenever it is re-added.
Additional parameters
Note: Using “if” and “ifnot” without a container element
Sometimes you may want to control the presence/absence of a section of markup without having any container element that can hold an if
or ifnot
binding. For example, you might want to control whether a certain <li>
element appears alongside siblings that always appear:
<li>This item always appears</li>
<li>I want to make this item present/absent dynamically</li>
In this case, you can’t put if
on the <ul>
(because then it would affect the first <li>
too), and you can’t put any other container around the second <li>
(because HTML doesn’t allow extra containers within <ul>
s).
To handle this, you can use the containerless control flow syntax, which is based on comment tags. For example,
<li>This item always appears</li>
<!-- ko if: someExpressionGoesHere -->
<li>I want to make this item present/absent dynamically</li>
<!-- /ko -->
The <!-- ko -->
and <!-- /ko -->
comments act as start/end markers, defining a “virtual element” that contains the markup inside. Knockout understands this virtual element syntax and binds as if you had a real container element.
Note: “ifnot” is the same as a negated “if”
The following markup:
<div data-bind="ifnot: someProperty">...</div>
… is equivalent to the following:
<div data-bind="if: !someProperty()">...</div>
… assuming that someProperty
is observable and hence you need to invoke it as a function to obtain the current value.
The main reason to use ifnot
instead of a negated if
is just as a matter of taste: many developers feel that it looks tidier.
Dependencies
None, other than the core Knockout library.