Hi, I encountered a problem while I was developing a global button bar just 
like a Microsoft ribbon. The idea is, that this button bar has certain base 
functions, like add/delete/update. But the logic should be adapted to the 
current site or item. Thus, I need to change the controller of the 
directive. 

I solved that problem basically with a factory, which stores the current 
controller name and the directive observes that field.


var ButtonBarControlDirective = function ($rootScope, ButtonBarFactory,
$controller) {

    return {
       restrict: 'E',
       scope: {},
       templateUrl: "app/views/buttonbars/bar.html",
       controllerAs: "barController",
       transclude: true,
       controller: function ($scope, $element, $transclude) {

            var ctrl;
           var self = this;

            $scope.$watch(
               function () { return ButtonBarFactory.controllerName; },
               function handleChange(newValue, oldValue) {
                   if (newValue) {
                       refresh(newValue);
                   }
               }
           );

            self.ctrl = {};

            var refresh = function (controllerName) {
               if (ctrl) {
                   ctrl.$destroy();
                   ctrl = null;
               }

               // The bar controller will be injected and the methods(crud) 
and properties will be conntected
               // to the directive controller in order to make themavailable 
for the template.
               // The controllers should implement an interface for the 
required 
fields and methods.

               ctrl = $rootScope.$new();
               $controller(controllerName, { $scope: ctrl });

                self.ctrl = ctrl;
           }
       }
   }
}

var ButtonBarFactory = function ($rootScope) {

    var buttonBarFac = {};
   buttonBarFac.controllerName = "";

    buttonBarFac.updateController = function (newController) {
       buttonBarFac.controllerName = newController;
       $rootScope.$digest();
   }
   return buttonBarFac;
};


The controller is saved in a field and the directive template can access 
the methods of that injected controller.

This works great, but it is a bit ugly. All the dynamic injected controller 
needs to implement certain methods and JavaScript does not support 
interfaces unfortunately. Does anyone have a better/nicer solution which 
can solve my problem?

-- 
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