Permet de rafraichir une partie du jade ( select , tableau toussa )

// Partenaire 
ms-select(ms-id="partenaire",
		ms-meta="::(typeRepasCreModCtl.fct.meta.typeRepas.refPartenaire_TypeRepasR)", 
		ms-value="typeRepasCreModCtl.fct.data.typeRepas.refPartenaire_TypeRepasR", 
		ms-item-id="id_partenaireList_PartenaireR", 
		ms-item-display="nom_partenaireList_PersonneR", 
		ms-search-enabled="true", 
		ms-items="typeRepasCreModCtl.fct.partenairesList", 
		ms-on-change="typeRepasCreModCtl.fct.onChangePartenaire(value)")

// Type de convive
ms-refresher(ms-id-r="typeConvive")
		ms-select(ms-id="typeConvive", ms-meta="::(typeRepasCreModCtl.fct.meta.typeRepas.refRegimeGroupe_TypeRepasR)", ms-value='typeRepasCreModCtl.fct.data.typeRepas.refRegimeGroupe_TypeRepasR', ms-item-id="id_RegimeGroupeR", ms-item-display="libelle_RegimeGroupeR", ms-search-enabled="true", ms-api-params="::typeRepasCreModCtl.fct.selectTypeConvive")
                                      

// Lieu de commande
ms-refresher(ms-id-r="lieuxCommande")
		ms-select(ms-id="lieuxCommande", ms-meta="::(typeRepasCreModCtl.fct.meta.typeRepas.refLieuCommande_TypeRepasR)", ms-value='typeRepasCreModCtl.fct.data.typeRepas.refLieuCommande_TypeRepasR', ms-item-id="id_LieuCommandeR", ms-item-display="lib_LieuCommandeR", ms-search-enabled="true", ms-api-params="::typeRepasCreModCtl.fct.selectLieuxCommande")

// Modification du partenaire , on passe l'id du partenaire aux select typeconvive et lieu de commande
            fct.onChangePartenaire = function (value) {
                fct.selectTypeConvive.apiParam = value;
                fct.selectLieuxCommande.apiParam = value;
                fct.askChildRefresh('typeConvive');
                fct.askChildRefresh('lieuxCommande');
            };

Code source de la directive ms-refresher

angular.module('core.directives.refresher', [])
    .directive('msRefresher',function () {
  return {
    transclude: true,
    controllerAs : 'msRefresherCtrl',
    controller: function($scope, $transclude,
                         $attrs, $element,$timeout,$parse,$filter,$injector) {
      var msRefresherCtrl=this;
      var MsModalService=$injector.has('MsModalService')?$injector.get('MsModalService'):undefined;                             
      msRefresherCtrl.childScope=undefined;
      msRefresherCtrl.hasCondition=angular.isDefined($attrs.condition);
      msRefresherCtrl.hasMsId=angular.isDefined($attrs.msIdR);
      msRefresherCtrl.hasSuspendWatchers=angular.isDefined($attrs.suspendWatchers);
      msRefresherCtrl.hasFilteredExp=angular.isDefined($attrs.filteredExp);
      msRefresherCtrl.hasAllowNewWatchers=angular.isDefined($attrs.allowNewWatchers);
      msRefresherCtrl.hasRefreshOnce=angular.isDefined($attrs.refreshOnce);
      msRefresherCtrl.isExpression=angular.isDefined($attrs.isExpression);
      var filteredExp;
      msRefresherCtrl.msId=undefined;
      var refreshing=false;
      var watchers = {
        suspended: false
      };        
      msRefresherCtrl.refresh=function(wait) {
                refreshing=true;
                $element.empty();
          
                var func=function() {
                    $transclude(function(clone, newScope) {
                      msRefresherCtrl.childScope = newScope;
                      $element.append(clone);
                      if (msRefresherCtrl.hasSuspendWatchers) {
                         $timeout(function(){
                             $timeout(function(){
                                watchers = {
                                    suspended: false
                                };        
                                suspendWatchers(msRefresherCtrl.childScope);
                                 refreshing=false;
                                 if (wait) {
                                    MsModalService.closeWaitPopup();      
                                 }
                             },1000,false);            
                         },undefined,false);                      
                      } else {
                          refreshing=false;
                         if (wait) {
                            MsModalService.closeWaitPopup();      
                         }
                        
                      }

                    });
                };
                if (msRefresherCtrl.childScope) {
                  msRefresherCtrl.childScope.$destroy();
                  msRefresherCtrl.childScope = null;
                  $timeout(function() {
                      func();
                  },undefined,false);      
                } else {
                    func();
                }

      };
      if (msRefresherCtrl.hasCondition) {
          $scope.$watch($attrs.condition, function(value) {
              if ((msRefresherCtrl.hasRefreshOnce)&&(refreshing)) {
                  return;
              }
              msRefresherCtrl.refresh();    
           });          
      }
      if (msRefresherCtrl.hasFilteredExp) {
        $scope.filteredExpWatcher=$scope.$watch($attrs.filteredExp, function(value) {
            if (value!==undefined) {
                  $scope.filteredExpWatcher();
                  delete $scope.filteredExpWatcher;
                  filteredExp=value;
            }              
        });          
      }
      if (msRefresherCtrl.hasMsId) {
         $scope.$on('msRefresh',function(event,params) {
            if ((params)&&(params.msId)) {
                if (!msRefresherCtrl.msId) {
                    msRefresherCtrl.msId=$attrs.msIdR;
                    if (msRefresherCtrl.isExpression) {
                      msRefresherCtrl.msId=$scope.$eval($attrs.msIdR);
                    }                    
                }
                if ((params.msId===msRefresherCtrl.msId)||((angular.isArray(msRefresherCtrl.msId))&&(msRefresherCtrl.msId.indexOf(params.msId)>-1))) {
                    if ((msRefresherCtrl.hasRefreshOnce)&&(refreshing)) {
                       return;
                    }                
                    event.preventDefault();
                    if (params.msWaitPop) {
                        MsModalService.showWaitPopup(true);
                        $timeout(function() {
                            msRefresherCtrl.refresh(true);
                            $timeout(function() {
                                if (params.msCallBack) {
                                    params.msCallBack(params.msCallBackParams);
                                }
                            },undefined,false);   
                        },100);

                    } else {
                        msRefresherCtrl.refresh();    
                        if (params.msCallBack) {
                            $timeout(function() {
                                params.msCallBack(params.msCallBackParams);
                            },undefined,false);   
                        }
                    }                    
                }
            }
         }); 
      }
      if ((msRefresherCtrl.hasMsId)&&(!msRefresherCtrl.hasCondition)&&(!msRefresherCtrl.hasSuspendWatchers)) {
        if ((msRefresherCtrl.hasRefreshOnce)&&(refreshing)) {
           return;
        }                          
          msRefresherCtrl.refresh();
      }
        

      function suspendWatchers(scope) {
        iterateSiblings(scope, suspendScopeWatchers);
        iterateChildren(scope, suspendScopeWatchers);
      }

      function resumeWatchers(scope) {
        iterateSiblings(scope, resumeScopeWatchers);
        iterateChildren(scope, resumeScopeWatchers);
      }

      var mockScopeWatch = function(scopeId) {
        return function(watchExp, listener, objectEquality, prettyPrintExpression) {
          watchers[scopeId].unshift({
            fn: angular.isFunction(listener) ? listener : angular.noop,
            last: void 0,
            get: $parse(watchExp),
            exp: prettyPrintExpression || watchExp,
            eq: !!objectEquality
          });
        };
      };

      function suspendScopeWatchers(scope) {
        if(!watchers[scope.$id]) {
          watchers[scope.$id] = scope.$$watchers || [];
          scope.$$watchers = [];
          if (angular.isArray(filteredExp)) {
            // l'idée est de pousser ceux qui ne correspondent pas au filtre...
            var found,i,j;
            for(i=watchers[scope.$id].length-1;i>=0;i--) {
                found=false;
                for(j=0;j<filteredExp.length;j++) {
                    if (filteredExp[j]===watchers[scope.$id][i].exp.toString()) {
                        found=true;
                        break;
                    }
                }
                if (!found) {
                    scope.$$watchers.push(watchers[scope.$id][i]);
                    watchers[scope.$id].splice(i,1);
                }
            }
          }
          // suppression totale, on empeche de créer des watchers a la volée...
          if (!msRefresherCtrl.hasAllowNewWatchers) {
                scope.$watch = mockScopeWatch(scope.$id);            
          }
        }
      }

      function resumeScopeWatchers(scope) {
        if(watchers[scope.$id]) {
          scope.$$watchers = watchers[scope.$id];
          if(scope.hasOwnProperty('$watch')) delete scope.$watch;
          watchers[scope.$id] = false;
        }
      }

      function iterateSiblings(scope, operationOnScope) {
        while (!!(scope = scope.$$nextSibling)) {
          operationOnScope(scope);
          iterateChildren(scope, operationOnScope);
        }
      }

      function iterateChildren(scope, operationOnScope) {
        while (!!(scope = scope.$$childHead)) {
          operationOnScope(scope);
          iterateSiblings(scope, operationOnScope);
        }
      }    

    }
  };
});