2013-09-04 15 views
12

http://plnkr.co/edit/Rf0VItthVBg6j0z7KudOJak uzyskać dostęp do zakresu kątowego z przycisków dialogowych jQuery?

Używam okna dialogowego jQuery i chcesz używać przycisków dialogowych, ale nie wiem, jak się w zakresie do wyzwalania (obecnie nieistniejąca) $ http lub $ zasobów oddzwonić do serwera ze zaktualizowanym modelem po kliknięciu przycisku dialogowego jQuery. Czuję się tak, jakbym zamierzał o tym źle, ale nie wiem, w którą stronę tu pójść.

Odpowiedz

23

Możesz użyć funkcji Kątowych, aby znaleźć zakres dołączony do elementu i wywołać na nim funkcję. Wolę go oddzielić i znaleźć katalog główny ng-app i nadać zdarzenie w aplikacji, aby zewnętrzny kod nie znał szczegółów kodu wewnętrznego, z wyjątkiem zdarzenia, które emitujesz.

angular.$externalBroadcast = function (selector, event, message) { 
    var scope = angular.element(selector).scope(); 

    scope.$apply(function() { 
     scope.$broadcast(event, message); 
    }); 
}; 

Następnie z dowolnego kodu, można nazwać coś takiego:

angular.$externalBroadcast('#app-container', 'doSomething', parameters); 

i wewnątrz aplikacji, chciałbym zrobić coś takiego:

$rootScope.$on('doSomething', function(parameters) { 
    // handle the external event. 
}); 

Jeśli don” Takie podejście, po prostu zasięg:

var scope = angular.element(selector).scope(); 

I zrób coś z tym. Po prostu upewnij się, że dzwonisz pod numer scope.$apply, bo inaczej cykl trawienia się nie stanie.

+0

W powyższej sytuacji istnieje sposób na uzyskanie fabryki lub zakresu dyrektywy? –

+0

Nvm. Wygląda na to, że zasięg, jaki otrzymujesz, to rootScope. Dołączyłem usługę do zakresu głównego i mogłem ją nazwać tak, jak potrzebowałem. Dzięki za to! –

4

Najlepszym sposobem jest dodanie dyrektywy do kontroli. Nie jest dobrym pomysłem, aby dodać jQuery z angularjs obok. Podjęto dyrektywę, aby dokonać tego rodzaju manipulacji.

Oto, jak zmodyfikowałem twój numer plunkr, aby pokazać, co możesz zrobić z dyrektywami.

app.directive('date', function() { 
    return { 
    restrict: 'A', 
    require: '^ngModel', 
    link: function(scope, elm, attrs, ctrl) { 
     var dp = $(elm); 

     dp.datepicker({ 
     onSelect: function(dateText) { 
      scope.$apply(function() { // Apply cause it is outside angularjs 
      ctrl.$setViewValue(dateText); // Set new value of datepicker to scope 
      }); 
     } 
     }); 

     scope.$watch(attrs.ngModel, function(nv) { 
     dp.datepicker('setDate', nv); // Update datePicker date when scope change 
     }); 
    } 
    } 
+0

Moje pytanie nie ma nic wspólnego z funkcją wyboru daty i dotyczy wszystkich przycisków, które można dodać do okna dialogowego jQuery, aby wywołać metodę zakresu kontrolera. – sonicblis

Powiązane problemy