AngularJS UI-Kalender nicht aktualisieren von Terminen auf dem Kalender
Ich bin mit Angular UI-Kalender zeigen einige Veranstaltungen auf dem Kalender. Die Veranstaltungen sind mit feinen, auf den Kalender. Aber wenn ich das update jedem Fall die details, die das Ereignis detail wirklich geändert, aber nicht geändert werden, auf die Kalender-Anzeige(z.B.: start).
Zunächst, nachdem ich verändert die Veranstaltung, die details, ich habe eine Seite neu laden, um die Anzeige geändert, ändert und es funktionierte auch.In dieser Methode, die ich hatte, leer $scope.events = [];
array, welches ich ausgefüllt, nachdem das abrufen von Einträgen aus der DB.
Aber jetzt, ich wollen, um zu vermeiden, dass die Seite neu geladen. So, nachdem die Ereignis-details geändert modales Fenster, lösche ich den Inhalt $scope.events
array mit $scope.events = [];
und dann mittels API-Aufruf, fülle ich die neuen events wieder in $scope.events
array. Dies ist in Ordnung, wie die Listenansicht zeigt die modifizierte events details. Aber der Kalender selbst zeigt an, alte Einträge. e.g wenn ich start
vom 11. April bis 13. April, der Kalender zeigt die Veranstaltung am 11. April in der Erwägung, dass die Listenansichten zeigt die geänderten Daten ich.e 13 April. Mit Neuladen der Seite, behebt dieses ich.e-Ereignis gezeigt wird, auf geänderte Datum(13. April).
Wie kann ich sicherstellen, dass das Ereignis geändert wird, auf den Kalender zu, ohne eine Seite neu laden ?
Versuchte ich calendar.fullCalendar('render');
nach dem abrufen der neuen Einträge aus der DB, aber es löst das Problem nicht.
Hier sind einige codes :
Zunächst Tat ich dies, um Daten zu senden an die DB und dann hat die Seite neu laden, um aktualisierte Daten abzurufen.
$http.put(url,senddata).success(function(data){$window.location.reload();});
Nun möchte ich vermeiden, die Seite neu laden, so habe ich
$http.put(url,senddata).success(function(data){//$window.location.reload();//sends modified data to server
$scope.events = []; //clear events array
$http.get(url2).success(function(data){ //fetch new events from server, and push in array
$scope.schedule = data;
for(var i=0;i<data.length;i++)
{
$scope.events.push({
idx: data[i].idx,
title: data[i].title,
description : data[i].description,
allDay: false,
start: new Date(data[i].start),
end: new Date(data[i].end),
});
calendar.fullCalendar('render'); //Tried even this, didn't work
}
});
Obigen code schiebt modifizierte Ereignis in event
array als sichtbar in der Liste anzeigen, aber der Kalender zeigt immer noch den alten Fall bis die Seite neu geladen wird.
InformationsquelleAutor Aniket Sinha | 2014-04-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Beibehaltung der gleichen array-Instanz.
Statt:
$scope.events = []
Versuchen:
$scope.events.slice(0, $scope.events.length);
Dann, wenn der server die Anfrage kommt zurück, fügen Sie jedes Element einzeln zu dem vorhandenen array:
for(var i = 0; i < newEvents.length; ++i) {
$scope.events.push(newEvents[i]);
}
Der Grund, warum ich behaupten, dass das was du da beschreibst klingt wie der Kalender könnte sein festhalten an der alten Liste von Veranstaltungen. Der Kalender könnte nicht wissen, zu aktualisieren, seine Referenz, also stattdessen lassen, halten die gleiche Referenz, aber ändern Sie den Inhalt des Arrays.
Danke @KishoreRelangi - ich weiß nicht einmal daran erinnern, die details, aber froh, dass es geholfen hat!
Zu erklären, die Antwort weiter. wenn Sie die Speicherung eventsources in ein array welches beobachtet wird (Referenz des Arrays), die durch die Richtlinie und aktualisiert den Kalender, Wann die variable geändert. wenn Sie code schreiben, wie $scope.events = []; zu klar die Ereignisse beim erstellen eines neuen Array - (neue Referenz) und die Zuordnung zu $Umfang.Veranstaltungen. Aber der watcher beobachtet die frühere Referenz. $Umfang.Veranstaltungen.slice(0, $Umfang.Veranstaltungen.Länge); ist ein cleverer Weg, um deaktivieren Sie das array ohne änderung der Referenz, die beobachtet wird durch die Richtlinie.
Siehe @Emeka Antwort unten, wenn Sie möchten, deaktivieren Sie das array - Sie sollten mit splice statt der Scheibe
wie kann ich das ändern $Umfang.events = [], um, ohne zu bekommen eine Fehlermeldung undifined ? Ich bin Spleißen ein nicht initialisiertes array
InformationsquelleAutor Studio4Development
Nur eine kurze Korrektur zu Studio4Development Antwort. Sollten Sie "splice" nicht "slice". Scheibe gibt die beschnitten array. Was wollen wir eigentlich verändern Sie das ursprüngliche array. So können Sie verwenden:
sowie das hinzufügen neuer Ereignisse:
InformationsquelleAutor Emeka
Weiß nicht, ob du die Lösung gefunden für dein problem, aber was für mich gearbeitet wurde:
InformationsquelleAutor PPR
Hier ist, wie ich fest ein ähnliches problem auf meiner Seite.
Ansicht (vereinfacht, Hinweis: mit jade)
controller:
Als pro-ui-Kalender, docs, beginne ich mit einem leeren array für meine event-Quellen. Ignorieren, dass sollte ich wohl benennen Sie diese eventSources, um etwas über den shop-Namen (Weide, nugget)
Ich dann eine factory-Funktion, die eine http-Anforderung und zieht eine Reihe von events aus der DB. Die Ereignisse haben alle "Titel", "Beginn", "Ende" - Eigenschaften (stellen Sie sicher, dass Ihre Datum-format ist korrekt). Sie haben auch eine "shop" - Eigenschaft, die mir sagt, welche Kalender hinzufügen, um das Ereignis zu.
Also nach Erhalt der Daten mache ich zwei lokale arrays in einer Schleife durch das empfangen von http-Daten und zuordnen der Ereignisse zu den lokalen arrays durch das Geschäft. Endlich kann ich wieder Rendern der Kalender mit der richtigen event-Daten durch den Aufruf addEventSource, die automatisch neu gerendert, die als pro den fullCalendar docs
Sieht es etwas entlang der Linien von diesem iirc:
InformationsquelleAutor AlexDelPiero
Ich hatte einige ähnliche Probleme, wo sich Ereignisse nicht als refetched nach der Entleerung meiner "eventSource" array ($Umfang.eventSources = [$scope.completedEvents]) und sich vermehren, es mit neuen events. Ich war in der Lage zu überwinden diese zunächst durch Aufruf von 'removeEvents',
Dies ist hackish, so nach weiterem tüfteln habe ich festgestellt, dass Ereignisse waren refetched, wenn mein Kind das array geändert wird,
Sich nach der Durchsicht der Quelle kann ich sehen, dass die eventSource array wird beobachtet, aber die 'refetch' ist nie Auftritt. außerdem, ich war nie in der Lage, um die folgenden arbeiten,
InformationsquelleAutor Ryan Ruppert
Laut ui-Kalender-code, es funktioniert tatsächlich Uhr eventSources aber nie die tatsächlichen, individuellen Quellen. So ein push, um, sagen wir, $Umfang.events ($Umfang.eventSources = [$scope.Ereignisse]), wird nie ausgelöst nichts.
So schieben Sie events zu $Umfang.eventSources[0]
InformationsquelleAutor Niroop
Als Sie bereits genau wissen, Kalender angewiesen ist, auf JQuery. Also, alles, was Sie tun müssen, ist eine ID, die auf Ihren Kalender so:
und dann, Wann immer Sie wollen, aktualisieren Sie den Kalender einfach anrufen:
Ich kämpfte mit diesem für einige Zeit, und dieser behob alle meine Probleme. Ich hoffe, dies wird dir auch helfen!
Goodluck!
$('#calendar').fullCalendar('refetchEvents')
?? Wo auch immer ich push-event in das array ?InformationsquelleAutor Glen
Obwohl es späte Antwort, aber hoffe, es kann einigen helfen. Ich sage es weiter Schritt für Schritt.
Müssen Sie halten die gleiche Quelle wie Studio4Development erwähnt.
$Umfang.Veranstaltungen //keine Notwendigkeit, neu zu initialisieren es
Entfernen Sie die aktualisierte Veranstaltung aus Veranstaltungen array wie folgt (für das Letzte Ereignis im Ereignis-array):
$Umfang.Veranstaltungen.splice($Umfang.Veranstaltungen.Länge - 1, 1);
Für den Fall, dass kann überall existieren, in der Ereignisse-array müssen Sie den index benutzen:
und dann werden Sie es entfernen von Ereignissen-array wie dieses:
Als Nächstes werden Sie Holen diese Veranstaltung von der API, das einmal wie folgt aus:
getEvent(Daten.Id);
und in der callback-Methode werden Sie erneut fügen Sie die Ereignis-und Ereignisse-array:
var getSingleEventSuccessCallback = function (event) {
$Umfang.Veranstaltungen.push(event);
};
InformationsquelleAutor Faran Shabbir
War fest auf dieser für eine Weile.
Was scheint zu funktionieren für mich stellte sich heraus, ziemlich einfach zu sein
Ich hol meine Kalender von google und führen Sie eine Veranstaltung formatter-Funktion. In diesem definiere ich ein neues array und am Ende der Funktion, ich meine die Ereignisquelle gleich der neue array. Dann rufe ich
$scope.$apply
InformationsquelleAutor Loubot
Versuchen. Es funktionierte für mich.
InformationsquelleAutor snfrox