diff options
| author | Misko Hevery | 2012-06-06 13:58:10 -0700 |
|---|---|---|
| committer | Igor Minar | 2012-06-08 15:50:13 -0700 |
| commit | c3a41ff9fefe894663c4d4f40a83794521deb14f (patch) | |
| tree | b44037cfb0089cfea42f253b6ad1a09ccb7e2d86 /docs/content/guide/directive.ngdoc | |
| parent | 5c95b8cccc0d72f7ca3afb1162b9528c1222eb3c (diff) | |
| download | angular.js-c3a41ff9fefe894663c4d4f40a83794521deb14f.tar.bz2 | |
feat($compile): simplify isolate scope bindings
Changed the isolate scope binding options to:
- @attr - attribute binding (including interpolation)
- =model - by-directional model binding
- &expr - expression execution binding
This change simplifies the terminology as well as
number of choices available to the developer. It
also supports local name aliasing from the parent.
BREAKING CHANGE: isolate scope bindings definition has changed and
the inject option for the directive controller injection was removed.
To migrate the code follow the example below:
Before:
scope: {
myAttr: 'attribute',
myBind: 'bind',
myExpression: 'expression',
myEval: 'evaluate',
myAccessor: 'accessor'
}
After:
scope: {
myAttr: '@',
myBind: '@',
myExpression: '&',
// myEval - usually not useful, but in cases where the expression is assignable, you can use '='
myAccessor: '=' // in directive's template change myAccessor() to myAccessor
}
The removed `inject` wasn't generaly useful for directives so there should be no code using it.
Diffstat (limited to 'docs/content/guide/directive.ngdoc')
| -rw-r--r-- | docs/content/guide/directive.ngdoc | 84 |
1 files changed, 28 insertions, 56 deletions
diff --git a/docs/content/guide/directive.ngdoc b/docs/content/guide/directive.ngdoc index 26df46df..8657a5d4 100644 --- a/docs/content/guide/directive.ngdoc +++ b/docs/content/guide/directive.ngdoc @@ -321,34 +321,32 @@ compiler}. The attributes are: parent scope. <br/> 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 normalized element attribute name to their - corresponding binding strategy. Valid binding strategies are: - - * `attribute` - one time read of element attribute value and save it to widget scope. <br/> - Given `<widget my-attr='abc'>` and widget definition of `scope: {myAttr:'attribute'}`, - then widget scope property `myAttr` will be `"abc"`. - - * `evaluate` - one time evaluation of expression stored in the attribute. <br/> Given - `<widget my-attr='name'>` and widget definition of `scope: {myAttr:'evaluate'}`, and - parent scope `{name:'angular'}` then widget scope property `myAttr` will be `"angular"`. - - * `bind` - Set up one way binding from the element attribute to the widget scope. <br/> - Given `<widget my-attr='{{name}}'>` and widget definition of `scope: {myAttr:'bind'}`, - and parent scope `{name:'angular'}` then widget scope property `myAttr` will be - `"angular"`, but any changes in the parent scope will be reflected in the widget scope. - - * `accessor` - Set up getter/setter function for the expression in the widget element - attribute to the widget scope. <br/> Given `<widget my-attr='name'>` and widget definition - of `scope: {myAttr:'prop'}`, and parent scope `{name:'angular'}` then widget scope - property `myAttr` will be a function such that `myAttr()` will return `"angular"` and - `myAttr('new value')` will update the parent scope `name` property. This is useful for - treating the element as a data-model for reading/writing. - - * `expression` - Treat element attribute as an expression to be executed on the parent scope. - <br/> - Given `<widget my-attr='doSomething()'>` and widget definition of `scope: - {myAttr:'expression'}`, and parent scope `{doSomething:function() {}}` then calling the - widget scope function `myAttr` will execute the expression against the parent scope. + templates. Locals definition is a hash of local scope property to its source: + + * `@` or `@attr` - bind a local scope property to the DOM attribute. The result is always a + string since DOM attributes are strings. If no `attr` name is specified then the local name + and attribute name are same. Given `<widget my-attr="hello {{name}}">` and widget definition + of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect + the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the + `localName` property on the widget scope. The `name` is read from the parent scope (not + component scope). + + * `=` or `=expression` - set up bi-directional binding between a local scope property and the + parent scope property. If no `attr` name is specified then the local name and attribute + name are same. Given `<widget my-attr="parentModel">` and widget definition of + `scope: { localModel:'=myAttr' }`, then widget scope property `localName` 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`. + + * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. + If no `attr` name is specified then the local name and attribute name are same. + Given `<widget my-attr="count = count + value">` and widget definition of + `scope: { localFn:'increment()' }`, then isolate scope property `localFn` will point to + a function wrapper for the `increment()` expression. Often it's desirable to pass data from + the isolate scope via an expression and to the parent scope, this can be done by passing a + map of local variable names and values into the expression wrapper fn. For example if the + expression is `increment(amount)` then we can specify the amount value by calling the + `localFn` as `localFn({amount: 22})`. * `controller` - Controller constructor function. The controller is instantiated before the pre-linking phase and it is shared with other directives if they request it by name (see @@ -369,32 +367,6 @@ compiler}. The attributes are: * `^` - Look for the controller on parent elements as well. - * `inject` (object hash) - Specifies a way to inject bindings into a controller. Injection - definition is a hash of normalized element attribute names to their corresponding binding - strategy. Valid binding strategies are: - - * `attribute` - inject attribute value. <br/> - Given `<widget my-attr='abc'>` and widget definition of `inject: {myAttr:'attribute'}`, then - `myAttr` will inject `"abc"`. - - * `evaluate` - inject one time evaluation of expression stored in the attribute. <br/> - Given `<widget my-attr='name'>` and widget definition of `inject: {myAttr:'evaluate'}`, and - parent scope `{name:'angular'}` then `myAttr` will inject `"angular"`. - - * `accessor` - inject a getter/setter function for the expression in the widget element - attribute to the widget scope. <br/> - Given `<widget my-attr='name'>` and widget definition of `inject: {myAttr:'prop'}`, and - parent scope `{name:'angular'}` then injecting `myAttr` will inject a function such - that `myAttr()` will return `"angular"` and `myAttr('new value')` will update the parent - scope `name` property. This is usefull for treating the element as a data-model for - reading/writing. - - * `expression` - Inject expression function. <br/> - Given `<widget my-attr='doSomething()'>` and widget definition of - `inject: {myAttr:'expression'}`, and parent scope `{doSomething:function() {}}` then - injecting `myAttr` will inject a function which when called will execute the expression - against the parent scope. - * `restrict` - String of subset of `EACM` which restricts the directive to a specific directive declaration style. If omitted directives are allowed on attributes only. @@ -649,9 +621,9 @@ Following is an example of building a reusable widget. // This HTML will replace the zippy directive. replace: true, transclude: true, - scope: { zippyTitle:'bind' }, + scope: { title:'@zippyTitle' }, template: '<div>' + - '<div class="title">{{zippyTitle}}</div>' + + '<div class="title">{{title}}</div>' + '<div class="body" ng-transclude></div>' + '</div>', // The linking function will add behavior to the template |
