11

Sto usando ng-repeat per costruire una fisarmonica usando jQuery e TB. Per qualche ragione, questo funziona perfettamente quando è codificato, ma non si attiva al clic quando si trova all'interno della direttiva ng-repeat.jQuery non funziona con risultati di ng-ripetizione

Stavo pensando che il problema è da elementi jQuery non vincolanti caricati in dopo il fatto. Quindi, ho pensato che invece di caricare lo script al caricamento della pagina, sarebbe meglio caricare la funzione su .successo quando i dati vengono restituiti. Sfortunatamente, non riesco a capire come farlo funzionare.

pagina di prova: http://staging.converge.io/test-json

controller:

function FetchCtrl($scope, $http, $templateCache) { 
     $scope.method = 'GET'; 
     $scope.url = 'https://www.googleapis.com/pagespeedonline/v1/runPagespeed?url=http://www.web.com&key=AIzaSyA5_ykqZChHFiUEc6ztklj9z8i6V6g3rdc'; 
     $scope.key = 'AIzaSyA5_ykqZChHFiUEc6ztklj9z8i6V6g3rdc'; 
     $scope.strategy = 'mobile'; 

     $scope.fetch = function() { 
      $scope.code = null; 
      $scope.response = null; 

      $http({method: $scope.method, url: $scope.url + '&strategy=' + $scope.strategy, cache: $templateCache}). 
      success(function(data, status) { 
       $scope.status = status; 
       $scope.data = data; 
      }). 
      error(function(data, status) { 
       $scope.data = data || "Request failed"; 
       $scope.status = status; 
      }); 
     }; 

    $scope.updateModel = function(method, url) { 
     $scope.method = method; 
     $scope.url = url; 
    }; 
} 

HTML:

  <div class="panel-group" id="testAcc"> 

       <div class="panel panel-default" ng-repeat="ruleResult in data.formattedResults.ruleResults"> 
        <div class="panel-heading" toggle-collapse> 
         <h4 class="panel-title"> 
          <a data-toggle="collapse-next" href=""> 
           {{ruleResult.localizedRuleName}} 
          </a> 
         </h4> 
        </div> 
        <div class="panel-collapse collapse"> 
         <div class="panel-body"> 
          <strong>Impact score</strong>: {{ruleResult.ruleImpact*10 | number:0 | orderBy:ruleImpact}} 
         </div> 
        </div> 
       </div> 
      </div> 

jQuery(lavora al di fuori della ng-repeat)

$('.panel-heading').on('click', function() { 
    var $target = $(this).next('.panel-collapse'); 

    if ($target.hasClass('collapse')) 
    { 
     $target.collapse('show'); 
    }else{ 
     $target.collapse('hide'); 
    } 
}); 

Grazie per qualsiasi aiuto!

risposta

21

La risposta letterale è perché questi gestori sono vincolati al runtime, pertanto .panel-heading non esiste. È necessario delegazione evento

$(".panel").on("click", ".panel-heading", function() { 

Ora, dal momento che si sta utilizzando angolare, tutte manipolazione del DOM dovrebbero essere gestiti all'interno di una direttiva, non jQuery! Dovresti ripetere un gestore ng-click o una semplice direttiva.

<div class="panel-heading" toggle-collapse my-cool-directive> 

E il codice direttiva:

.directive("myCoolDirective", function() { 
    return { 
     restrict: "A", 
     link: function(scope, elem, attrs) { 
      $(elem).click(function() { 
       var target = $(elem).next(".panel-collapse"); 
       target.hasClass("collapse") ? target.collapse("show") : target.collapse("hide"); 
      }); 
     } 
    } 
}); 
+0

Questa è la risposta che stavo cercando anche se sono nuovo per Angular e non riesco a capire come aggiungere una direttiva personalizzata nel mio codice. Da tutto quello che ho letto, sembrerebbe che ho bisogno di spostare tutto in un modulo per poter aggiungere una direttiva come questa? È corretto? Se sì, ho bisogno di cambiare il modo in cui il controller è scritto come vedo che viene fatto in un altro codice con i moduli? Mi piacerebbe davvero imparare il modo "giusto" per farlo in Angular. Ancora una volta, mi dispiace per la mia mancanza di esperienza qui. Grazie. –

+0

Basta dichiarare un nuovo file, 'directives.js' - includi la dichiarazione della tua app in' var app = angular.module ("la tua app", [dipendenze qui]) '- quindi usa la direttiva' app.directive (sopra il codice) '- include' directives.js' nel tuo markup 'script' – tymeJV

+0

Ho provato questo, ma quando ho assegnato un nome modulo (ng-app =" moduleName "), il mio controller si rompe. Quello che stavo chiedendo se fosse necessario modificare il controller per farlo funzionare. –

6

Quando si utilizza ng-repeat e si deve attivare un evento click jquery, basta provare questo per me.

$(document).on("click", ".className", function() { 

    //your code here... 

    });