2013-08-15 21 views
8

Ho seguito questo grande tutorial (link) per Chosen e angolare (il codice è praticamente lo stesso molto)Chosen direttiva angolare non viene aggiornato

Qui è la mia direttiva:

app.angularModule.directive('chosen', function() { 
    var linker = function (scope, element, attrs) { 
     var list = attrs['chosen']; 

     scope.$watch(list, function() { 
      element.trigger('chosen:updated'); 
     }); 

     element.chosen({ width: '350px'}); 
    }; 

    return { 
     restrict: 'A', 
     link: linker 
    }; 
}); 

Ecco html:

<select data-placeholder="Choose a Category" multiple class="col-lg-8 chosen-select" chosen="items" 
          ng-options="item._backingStore.Name for item in items" ng-model="selectedCategories" > 
        </select> 

quello che voglio è, quando l'utente fa clic sul pulsante Modifica, finestra modale si apre, e le categorie che, qualora selezionato prima di fare clic pulsante Modifica, selezionate nella finestra modale.

qui è che parte del regolatore:

$scope.$watch(function() { return adminCrudService.getCategoriesForUpdate(); }, function() { 
       $scope.action = "edit"; 
       $scope.categoriesForUpdate = adminCrudService.getCategoriesForUpdate(); 
       if ($scope.categoriesForUpdate.length > null) { 
        $scope.selectedCategories = _.filter($scope.items, function (item) { 
         return _.contains($scope.categoriesForUpdate, item); 
        }); 
       } 
      }); 

ho collegato $ scope.selectedCategories e tutto va bene con loro, ma per qualche motivo non v'è nulla di selezionato nella scelta.

Quindi cosa sto facendo di sbagliato e come posso risolvere il problema?

EDIT

ho notato quando seleziono alcuni elementi, vicino modale, aprirlo di nuovo, valori selezionati ci sono di nuovo vigilia anche se ho messo questa linea all'interno $ guardare

$scope.selectedCategories = ""; 

EDIT 2

Così ho lasciato questo problema per un po ', perché avevo cose più importanti da affrontare. Ho provato senza scelto, cioè usando la selezione "normale" e il codice funziona. Quindi in modo definitivo la mia direttiva scelta non funziona come dovrebbe.

risposta

11

L'ho risolto, la soluzione è abbastanza semplice e diretta in realtà (quando si ottiene come funzionano le direttive angolari). Ecco l'intero codice per la direttiva:

app.angularModule.directive('chosen', function() { 
    var linker = function (scope, element, attrs) { 
     var list = attrs['chosen']; 

     scope.$watch(list, function() { 
      element.trigger('chosen:updated'); 
     }); 

     scope.$watch(attrs['ngModel'], function() { 
      element.trigger('chosen:updated'); 
     }); 

     element.chosen({ width: '350px'}); 
    }; 

    return { 
     restrict: 'A', 
     link: linker 
    }; 
}); 
+0

Questo è esattamente quello che stavo cercando, grazie mille !! – abhishekgarg

+0

A mio avviso, questa dovrebbe essere una parte della direttiva scelta, costringere l'utente di una libreria a fare cose del genere è semplicemente strano. – Millenjo

+0

In realtà, nella raccolta dovresti usare 'scope. $ WatchCollection (list, func)', e anche '$ watch *' restituisce la funzione per smettere di guardare, che dovrebbe essere chiamata quando '$ scope' distrugge:' scope. $ On ('$ destroy', function() { unwatchModel(); unwatchSource(); }); ' – Hikiko

1

Versione più estesa del commento alla soluzione precedente. Uguale all'autore, nel markup HTML Fornisco la raccolta di origine come chosen="vm.myCollection", in realtà analizzando la proprietà ng-options o ng-repeat con regexp è meglio, forse più tardi. Contrariamente a OP, utilizzo $ watchCollection per un array e richiamo gli unwatch quando l'ambito sta per distruggere.

(function() { 
    'use strict'; 
    angular.module('common.directives').directive('chosen', enterPressDirective); 

    function enterPressDirective() { 
     return { 
      restrict: 'A', 
      link: function (scope, elm, attrs) { 
       var unwatchModel = scope.$watch(attrs.ngModel, function() { 
        elm.trigger('chosen:updated'); 
       }); 

       var unwatchSource = scope.$watchCollection(attrs.chosen, function() { 
        elm.trigger('chosen:updated'); 
       }); 

       elm.chosen(); 

       scope.$on('$destroy', function() { 
        unwatchModel(); 
        unwatchSource(); 
       }); 
      } 
     }; 
    } 
}()); 
Problemi correlati