javascript - Directive scope using transclusion hiding parent scope of inner elements -
i'm trying implement directive delay apparition of container using ng-show , $timeout.
here's directive looks like:
angular.module('myapp')     .directive('delay', function($timeout) {         return {             template: '<div ng-show="showit" ng-transclude></div>',             replace: false,             transclude: true,             scope:true,             restrict: 'a',             link: function postlink(scope, element, attrs) {                 $timeout(function() {                         scope.showit = true;                 }, attrs.delay);             }         };     });   then, use in view this
<div delay="1000">     <intput type="text" ng-model="mytext"/> </div>   so far, delay works. yeah, i'm proud. then, mytext isn't accessible anymore controller because it's not visible parent scope. tried changing scope instead:
scope: {     mytext: '=' }   to establish two-way data-binding...without success.
what simplest way implement i'm trying achieve using directive? lot!
edit: golden rule
thanks lot gregl answer!
the best way around wrap ng-models in object make use of dot notation avoid binding ng-model child-scope. child scope use prototypal inheritance value, when value has been set in child scope, no longer looks parent scope.
the best way around keep in mind call "angularjs golden rule":
always use dot/period (.) in ng-model expressions.
that way, writing property correct object on correct scope.
however, if wanted work, directive makes use of transclude argument link function manual transclusion against correct scope.
sample.directive('delay', function($timeout) {   return {     template: '<div ng-show="showit"></div>',     replace: false,     transclude: true,     scope: {},     restrict: 'a',     link: function postlink(scope, element, attrs, nullctrl, transclude) {       var transcludescope = scope.$parent;       transclude(transcludescope, function(clone) {         element.find('div[ng-show]').append(clone);       });       $timeout(function() {         scope.showit = true;       }, attrs.delay);     }   }; });   this set scope of contents of <div ng-show="showit"> scope of element delay directive on. has benefit of having isolate scope can use multiple instances wherever like.
Comments
Post a Comment