You can do some stuff in your link function to do scope.$watch('attr val',
function(newV, oldV) {doStuff('to fix up the scope on attr change')}), or
you could make all the dynamic layouts on the page itself just react to
scope changes (which works great if you're not relying on non-angular
libraries), ng-if and ng-repeat will dynamically restructure the DOM to
reflect changes.

Also - also, if you are changing the page in response to "navigation", you
should take a look at ui-router and ng-router. I prefer ui-router, as it's
more flexible, but in both cases they'll handle injecting code into your
views based on routing like /widgets/1 going to /widgets/2, and in that
situation the directive link functions (and the page's top-level
controller) get re-run.

e

On Sat Dec 06 2014 at 9:47:44 AM siegeld <[email protected]> wrote:

> Eric,
>
> You are correct, thanks for pointing this out.  My code was working
> properly, I had a logic error.  What I forgot was that I wasn't navigating
> to a new page, my "navigation" occurred by changing a scope variable, and
> the page would then dynamically reconfigured.  This works fine except I
> guess if some of the logic for the page resides in the link function of a
> directive.  In any case, I fixed the problem by having the directive watch
> for value changes of the attribute, and to then reconfigure itself
> appropriately.
>
> Would it not make sense to at least have an option for directives to allow
> themselves to relink upon attribute changes?
>
> Regards,
>
> David
>
>
> On Thursday, December 4, 2014 9:12:14 AM UTC-5, Eric Eslinger wrote:
>
>> If the directive is only put into the DOM once, the link function is only
>> called once. Unless the fragment you provided is inside an ng-repeat or
>> something, it is correct that the link function only gets called the one
>> time. Maybe if you could make a plunk <http://plnkr.co/> that
>> encapsulates your expected and observed behaviors?
>>
>> Eric
>>
>> On Wed Dec 03 2014 at 8:23:20 PM siegeld <[email protected]> wrote:
>>
> Sorry, here is the use of the directive:
>>>
>>>  <area:scene-button-bar integration-id="currentArea.integrationId"
>>> max-scenes="5"></area:scene-button-bar>
>>>
>>> David
>>>
>>> On Wednesday, December 3, 2014 5:38:41 PM UTC-5, Frédéric Fanchamps
>>> wrote:
>>>>
>>>> Heu... in the code/html you have shared, you only create the directive
>>>> areaSceneButtonBar but you don't show the usage.
>>>> Missing something in your post?
>>>>
>>>> On Wednesday, December 3, 2014 9:59:00 PM UTC+1, siegeld wrote:
>>>>>
>>>>> I've created a directive that for some reason the link function only
>>>>> gets called once per app lifecycle, and that the scope in the directive
>>>>> appears shared when I route to different pages.  Please see the directive
>>>>> code below:
>>>>>
>>>>> lutronDirectives.directive('areaSceneButtonBar',
>>>>> ['LutronServerService', function(LutronServerService) {
>>>>>     var linker = function(scope, element, attributes) {
>>>>>         scope.scenes = [];
>>>>>         scope.model = 0;
>>>>>         for (var i = 0; i < parseInt(scope.maxScenes); i++) {
>>>>>             scope.scenes.push({name: "Scene " + i, number:
>>>>> i.toString()});
>>>>>         }
>>>>>         var area = LutronServerService.getLutronArea(scope.
>>>>> integrationId);
>>>>>         if (area != null)
>>>>>             scope.scenes = LutronServerService.getLutronArea(scope.
>>>>> integrationId).scenes;
>>>>>         else
>>>>>             scope.scenes = [];
>>>>>         scope.click = function(scene) {
>>>>>             LutronServerService.setAreaScene(scope.integrationId,
>>>>> scene);
>>>>>             scope.model = scene;
>>>>>         }
>>>>>         scope.$on('AreaEvent', function(event, obj) {
>>>>>             if (obj.integrationId == scope.integrationId &&
>>>>> obj.actionNumber == "6") {
>>>>>                 scope.deviceLevel = parseInt(obj.parameter)
>>>>>                 scope.model = obj.parameter;
>>>>>                 scope.$apply();
>>>>>             }
>>>>>         });
>>>>>         LutronServerService.queryAreaScene(scope.integrationId);
>>>>>     }
>>>>>     return {
>>>>>         restrict: 'E',
>>>>>         scope: {
>>>>>             integrationId: '=',
>>>>>             maxScenes: '=',
>>>>>         },
>>>>>         templateUrl: 'partials/areaSceneButtonBar.html',
>>>>>         link: linker
>>>>>     }
>>>>> }]);
>>>>>
>>>>> Please also see the templateUrl here:
>>>>>
>>>>> <div class="btn-group">
>>>>>   <label ng-repeat="scene in scenes" class="btn btn-primary"
>>>>>          ng-model="model" btn-radio="scene.number"
>>>>>          ng-click="click(scene.number)">
>>>>>     {{scene.name}}
>>>>>   </label>
>>>>> </div>
>>>>>
>>>>> You will notice that the template create a number of bootstrap radio
>>>>> buttons.
>>>>>
>>>>> So - what am I doing wrong?  Why doesn't the link function get run
>>>>> each time I create a new directive?
>>>>>
>>>>> Very puzzled...
>>>>>
>>>>> Thanks,
>>>>>
>>>>> David
>>>>>
>>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "AngularJS" group.
>>>
>> To unsubscribe from this group and stop receiving emails from it, send an
>>> email to [email protected].
>>> To post to this group, send email to [email protected].
>>
>>
>>> Visit this group at http://groups.google.com/group/angular.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "AngularJS" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/angular.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.

Reply via email to