aboutsummaryrefslogtreecommitdiffstats
path: root/src/ng/directive/input.js
diff options
context:
space:
mode:
authorPete Bacon Darwin2013-09-19 21:08:37 +0100
committerPete Bacon Darwin2013-09-19 21:08:37 +0100
commitf12c61e984e2fa7f6b225f3567d497f4ad36436d (patch)
tree22b528cf892cb2034d087eaec405d09da195c316 /src/ng/directive/input.js
parent72ad746b85e3dcfefd794d7dc376e7ade798ff49 (diff)
downloadangular.js-f12c61e984e2fa7f6b225f3567d497f4ad36436d.tar.bz2
docs(ngModelController): clarify issue with isolated scope directive
See #4043
Diffstat (limited to 'src/ng/directive/input.js')
-rw-r--r--src/ng/directive/input.js38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index ef55a7a2..fa953419 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -847,11 +847,8 @@ var VALID_CLASS = 'ng-valid',
* purposefully does not contain any logic which deals with DOM rendering or listening to
* DOM events. Such DOM related logic should be provided by other directives which make use of
* `NgModelController` for data-binding.
- * Note that you cannot use `NgModelController` in a directive with an isolated scope,
- * as, in that case, the `ng-model` value gets put into the isolated scope and does not get
- * propagated to the parent scope.
- *
*
+ * ## Custom Control Example
* This example shows how to use `NgModelController` with a custom control to achieve
* data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
* collaborate together to achieve the desired result.
@@ -929,6 +926,39 @@ var VALID_CLASS = 'ng-valid',
</file>
* </example>
*
+ * ## Isolated Scope Pitfall
+ *
+ * Note that if you have a directive with an isolated scope, you cannot require `ngModel`
+ * since the model value will be looked up on the isolated scope rather than the outer scope.
+ * When the directive updates the model value, calling `ngModel.$setViewValue()` the property
+ * on the outer scope will not be updated.
+ *
+ * Here is an example of this situation. You'll notice that even though both 'input' and 'div'
+ * seem to be attached to the same model, they are not kept in synch.
+ *
+ * <example module="badIsolatedDirective">
+ <file name="script.js">
+ angular.module('badIsolatedDirective', []).directive('bad', function() {
+ return {
+ require: 'ngModel',
+ scope: { },
+ template: '<input ng-model="innerModel">',
+ link: function(scope, element, attrs, ngModel) {
+ scope.$watch('innerModel', function(value) {
+ console.log(value);
+ ngModel.$setViewValue(value);
+ });
+ }
+ };
+ });
+ </file>
+ <file name="index.html">
+ <input ng-model="someModel">
+ <div bad ng-model="someModel"></div>
+ </file>
+ * </example>
+ *
+ *
*/
var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse',
function($scope, $exceptionHandler, $attr, $element, $parse) {