KeyLookup Expression
key
A KeyLookup expression specifies a value in the scope or HelperOptions scope that will be looked up. KeyLookup expressions can be the entire stache expression like:
{{key}}
Or they can makeup the method, helper, arguments and hash value parts of Call Expression, Helper Expression, and Hash Expressions:
{{method(arg1,arg2}} Call
{{helper arg1 arg2}} Helper
{{method( prop=hashValue )}} Hash
CALL_EXPRESSION.key
Looks up key
on the return value of CALL_EXPRESSION
.
{{#each(Todo.getList(complete=completed).value)}}
Parameters
- CALL_EXPRESSION
{Call Expression}
:A call expression that may or may not return a value.
- key
{String}
:A property value to look up on the result of
CALL_EXPRESSION
.
Use
The value returned up by a KeyLookup depends on what the key looks like, and what expression type the KeyLookup is within.
For example, {{method(~./key)}}
will call method
with
a compute that looks up the value of key
only in the top of the scope.
The rules are as follows:
- Call Expression arguments
{{method(key)}}
- values are passed. - Helper Expression arguments
{{helper key}}
- computes are passed. - hash value in Call Expression
{{method(hash=key)}}
- values are set as property values. - hash value in Helper Expression
{{method hash=key}}
- computes are set as property values. - special operator
{{%index}}
- lookup values in a special context provided by some helpers. - compute operator
{{method(~key)}}
- pass a compute instead of a value. - at operator
{{method(@key}}
- pass a function instead of trying to read the value of the function. - current operator
{{./key}}
- only lookup key at the top of the scope. - parent operator
{{../key}}
- lookup the value in the parent context. - context key
{{this}}
- return the current context/top of the scope.
Default key return values by expression and data types
Keys can have slightly different default behavior depending if they are used in:
- helper arguments like:
{{helper some.key}}
when compared to the other places they are used:
- insertion tags like:
{{some.key}}
- call-expression arguments like:
{{helper(some.key)}}
- event bindings like:
($click)="method(some.key)"
- data bindings like:
{some-attr}="some.key"
Furthermore keys return different values depending on the data type.
In general:
- Functions are called to get their return value. (Use the
@
operator to prevent this). - Keys in helper expression arguments that find observable data return a compute that represents the value.
- Keys in other expressions return the value.
- If no observable data is found, the key’s value is returned in all expressions.
The following illustrates what some.key
would return given
different data structures as a Helper Expression and in all other expressions.
// A non-observable JS object:
{some: {key: "value"}};
// Helper -> "value"
// Other -> "value"
// A non-observable JS object w/ a function at the end
{some: {key: function(){ return "value"; }}}
// Helper -> "value"
// Other -> "value"
// A non-observable JS object with intermeidate functions:
{some: function(){ return {key: "value"}}}
// Helper -> "value"
// Other -> "value"
// A observable can-map
{some: new Map({key: "value"})}
// Helper -> canCompute("value")
// Other -> "value"
// A method on an observable can-map that reads observables
var Some = Map.extend({key: function(){ return this.attr("value")}})
{some: new Some({value: "value"})}
// Helper -> canCompute("value")
// Other -> "value"