what's the meaning of '=?' in angularJS directive isolate scope declaration?

AngularjsAngularjs Directive

Angularjs Problem Overview


Does the question mark after equals have special meaning? ie:

scope: {foo: '=?'}

does the above mean 'do not raise error if 'foo' cannot be resolved?

Angularjs Solutions


Solution 1 - Angularjs

Yes:

> The 'isolate' scope takes an object hash which defines a set of local scope properties derived from the parent scope. These local properties are useful for aliasing values for templates. Locals definition is a hash of local scope property to its source:

> = or =attr - set up bi-directional binding between a local scope > property and the parent scope property of name defined via the value > of the attr attribute. If no attr name is specified then the > attribute name is assumed to be the same as the local name. Given > <widget my-attr="parentModel"> and widget definition of scope: { > localModel:'=myAttr' }, then widget scope property localModel will > reflect the value of parentModel on the parent scope. Any changes to > parentModel will be reflected in localModel and any changes in > localModel will reflect in parentModel. If the parent scope > property doesn't exist, it will throw a > NON_ASSIGNABLE_MODEL_EXPRESSION exception. You can avoid this behavior > using =? or =?attr in order to flag the property as optional.

It should trigger the expected error on every digest that affects the scope property:

parentSet = parentGet.assign || function() {
// reset the change, or we will throw this exception on every $digest
lastValue = scope[scopeName] = parentGet(parentScope);
     throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] +
     ' (directive: ' + newScopeDirective.name + ')');
};

//...


if (parentValue !== scope[scopeName]) {
    // we are out of sync and need to copy
    if (parentValue !== lastValue) {
        // parent changed and it has precedence
        lastValue = scope[scopeName] = parentValue;
    } else {
        // if the parent can be assigned then do so
        parentSet(parentScope, lastValue = scope[scopeName]);
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNikitaView Question on Stackoverflow
Solution 1 - AngularjsMatt ZeunertView Answer on Stackoverflow