2016-04-17 7 views
5

Ich habe ein Benachrichtigungssystem, das funktioniert. Gerade jetzt, wenn keine Benachrichtigung erfolgt oder nicht, wird die Benachrichtigung in einem <span class='glyphicon glyphicon-inbox' aria-hidden="true"></span> wie Stackoverflow angezeigt. aber mein Wunsch ist es, wenn es eine Benachrichtigung ist, möchte ich die Box in einWenn die Anzahl der Benachrichtigungen Null ist, möchte ich, was ich gerade habe (Box), aber wenn es nicht Null ist, möchte ich Box in Badge mit Benachrichtigung Count

<span class="badge badge-notify" style="red">notification count</span> 

wieder wie ein Stack-Überlauf gedreht werden.

Also habe ich versucht, eine bestimmte Klasse zu entfernen, die die Form der Box ändert, wenn ich zähle == 0 und die Klasse hinzufüge, wenn die Anzahl nicht Null ist. Ich habe versucht, das eingestellte Intervall auch einzustellen, aber es wird einfach nicht funktionieren.

Können Sie mir bitte helfen?

unten ist, was ich in navbar habe, habe ich die Benachrichtigungsbox und das Abzeichen eingerichtet.

<li class="dropdown"> 
<a href="#" class="dropdown-toggle notification-toggle" data-toggle="dropdown" role="button" aria-expanded="false" id="button"> 
<span class='glyphicon glyphicon-inbox' aria-hidden="true"></span> 
<span class="caret"></span> 
<span class="badge badge-notify">notification count</span></a> 
    <ul class="dropdown-menu" role="menu" id='notification_dropdown'> 

       </ul> 
      </li> 

unter meiner Ajax-Funktion ist Benachrichtigung

<script> 
    $(document).ready(function(){ 
     $(".notification-toggle").click(function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: "{% url 'get_notifications_ajax' %}", 
      data: { 
      csrfmiddlewaretoken: "{{ csrf_token }}", 
      }, 
     success: function(data){ 
      $("#notification_dropdown").html(' <li role="presentation" class="dropdown-header">alarm</li>'); 
      var count = data.count 
      console.log(count) 
      if (count == 0) { 
        $("#notification_dropdown").removeClass('notification'); 
       var url = '{% url "notifications_all" %}' 
       $("#notification_dropdown").append("<li><a href='" + url+ "'>view all</a></li>") 
      } else { 
        $("#notification_dropdown").addClass('notification'); 
       $(data.notifications).each(function(){ 
       var link = this; 
       $("#notification_dropdown").append("<li>" + link + "</li>") 
       }) 
      } 
      console.log(data.notifications); 
      }, 
      error: function(rs, e) { 
      console.log(rs); 
      console.log(e); 
      } 
     }) 
     }) 
    }) 
    </script> 

so disply, was ich war irgendwie versucht,

 <style> 
      {% block style %} 
    #notification_dropdown{ 
    } 

    #notification_dropdown.notification{ 
     color: red; 
    } 


     {% endblock %} 
      </style> 

and 

    <script> 
setTimeout(function(){ 
    $("#notification_dropdown:visible").addClass('notification'); 
}, 2000); 
    </script> 

vielleicht stelle ich die ID falsch ... das tat nichts, leider .

nicht sicher, ob dies erforderlich ist, werde ich auch Funktion für die Benachrichtigung (Ajax) hinzufügen

def get_notifications_ajax(request): 
    if request.is_ajax() and request.method == "POST": 
     notifications = Notification.objects.all_for_user(MyProfile.objects.get(user=request.user)).recent() 
     count = notifications.count() 
     notes = [] 
     for note in notifications: 
      notes.append(note.get_link.encode('utf-8')) 
     data = { 
      "notifications": notes, 
      "count": count, 
     } 
     print data 
     json_data = json.dumps(data) 
     print json_data 
     return HttpResponse(json_data, content_type='application/json') 
    else: 
     raise Http404 

Also meine Frage)

1), was habe ich falsch gemacht, dass die Form/Farbe Benachrichtigungsfeld nicht ändern, wenn Benachrichtigung nicht Null ist, und wie erreiche ich, was ich will die Box in ein

gedreht werden soll
<span class="badge badge-notify" style="red">notification count</span> 

2) ich bin in der Lage Anzahl der Benachrichtigung in Konsole wit anzuzeigen h console.log (Anzahl), wie zeige ich diese Anzahl in der Navigationsleiste an?

+1

Sie müssen 'setInterval()' in der JavaScript verwenden, um den Server für Meldungen alle paar Sekunden abzufragen, sonst wie wird Ihr Frontend Know jede Änderung? – ygesher

+0

@jegesh Ich habe es eingestellt, aber kein Unterschied –

+0

Habe ich richtig verstanden, dass Sie die Benachrichtigung Count auf '' klicken möchten? Oder möchten Sie, dass es sich ändert, obwohl der Benutzer nichts unternimmt, aber eine Benachrichtigung für ihn erscheint? Im Moment prüft Ihr Code nur, ob eine Benachrichtigung vorliegt, wenn der Benutzer auf den Anker klickt. Wenn Sie fortwährend überprüfen möchten, ob es Benachrichtigungen für den Benutzer gibt, sollten Sie in Erwägung ziehen, 'setInterval()' zu verwenden, die alle X Sekunden eine AJAX-Anfrage stellen. – iulian

Antwort

1

Es sieht so aus, als ob alle Änderungen, die Sie in AJAX-Erfolg vornehmen, auf #notification_dropdown sind, aber in Ihrer HTML-Seite werden die <span> Elemente, die Sie umschalten wollen, nie berührt. Es ist das gleiche in Ihrem CSS:

<style> 
     {% block style %} 
#notification_dropdown{ 
} 

#notification_dropdown.notification{ 
    color: red; 
} 


    {% endblock %} 
     </style> 

Die CSS-Selektoren verwendet (#notification_dropdown) nicht über die CSS-Eigenschaften auf die <span> Elemente anzuwenden, die Materie.

Eine der Möglichkeiten, dieses Problem zu beheben -

auf Ihren navbar HTML ändern:

<li class="dropdown"> 
<a href="#" class="dropdown-toggle notification-toggle" data-toggle="dropdown" role="button" aria-expanded="false" id="button"> 
<span id="no_notify" class='glyphicon glyphicon-inbox' aria-hidden="true"></span> 
<span class="caret"></span> 
<span id="notify_count" class="badge badge-notify">notification count</span></a> 
    <ul class="dropdown-menu" role="menu" id='notification_dropdown'> 

       </ul> 
      </li> 

Änderung: hinzugefügt id Attribut sowohl no notify und notify count badgespan Elemente.

Und

Ihre ändern Ajax-Skript:

<script> 
    $(document).ready(function(){ 
     $(".notification-toggle").click(function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: "{% url 'get_notifications_ajax' %}", 
      data: { 
      csrfmiddlewaretoken: "{{ csrf_token }}", 
      }, 
     success: function(data){ 
      $("#notification_dropdown").html(' <li role="presentation" class="dropdown-header">alarm</li>'); 
      var count = data.count 
      console.log(count) 

      if (count == 0) { 
        $("#notify_count").html(count).hide(); 
        $("#no_notify").show(); 

        $("#notification_dropdown").removeClass('notification'); 
       var url = '{% url "notifications_all" %}' 
       $("#notification_dropdown").append("<li><a href='" + url+ "'>view all</a></li>") 
      } else { 
       $("#no_notify").hide(); 
       $("#notify_count").html(count).show(); 

        $("#notification_dropdown").addClass('notification'); 
       $(data.notifications).each(function(){ 
       var link = this; 
       $("#notification_dropdown").append("<li>" + link + "</li>") 
       }) 
      } 
      console.log(data.notifications); 
      }, 
      error: function(rs, e) { 
      console.log(rs); 
      console.log(e); 
      } 
     }) 
     }) 
    }) 
    </script> 

Änderung: hinzugefügt $("#no_notify") und $("#notify_count") bezogenen Linien zu show()/hide() diesen Spannweiten basierend auf count

Und Ihre SetTimeout ändern:

<script> 
    setTimeout(function(){ 
     $(".notification-toggle").click(); 
    }, 2000); 
</script> 

$(".notification-toggle").click();triggers a click auf <eine> in Navbar, die den Ajax-Aufruf ausführt. Wenn die Anzahl von Ajax-Antwort Null ist, verstecken wir notify_count Span und zeigen no_notify sonst machen Sie das Gegenteil.

Auslösen eines Klicks auf die <ein>-Tag scheint eine gute Idee. Wenn Sie möchten, dass die Aktualisierung der Zählung in Zukunft nur auf Benutzeraktionen (ein Klick auf das Anchor-Tag) erfolgt und Sie nicht möchten, dass der Aufruf in regelmäßigen Abständen stattfindet, müssen Sie nur die setTimeout Logik loswerden.

Es ist eine bewährte Vorgehensweise, auch für den Fall, dass der POST-Aufruf an get_notifications_ajax fehlschlägt, einen Rückruf error für Ihren AJAX-Anruf hinzuzufügen.

+0

Vielen Dank Ihre Lösung funktioniert perfekt, und ich denke, ich verstehe die meisten von ihnen, aber ich fügte hinzu Fehler tho, Fehler: Funktion (rs, e) { console.log (rs); console.log (e); –

+0

Ich denke, Sie sprechen über die Möglichkeiten, mit Fehlersituation umzugehen. Es hängt von der Benutzererfahrung Strategie ab, die Sie übernehmen möchten. Sie können entscheiden, immer einen Fehler anzuzeigen (möglicherweise durch Überlagerung von Glyphicon-Inbox mit Glyphicon-Ausrufezeichen) oder wenn Sie den Fehler als unkritisch behandeln möchten, lassen Sie den aktuellen "Fehler" -Rückruf unverändert und hoffen auf die nächsten Aufrufe succee.What, wenn der Anruf nie erfolgreich ist? Nun, es hängt wieder davon ab, was du machen willst. Kann nur '!' Angezeigt werden, wenn drei aufeinanderfolgende Anfragen fehlschlagen. Sie haben eine Reihe von Optionen und Sie können wählen, die Ihren Benutzern am meisten Sinn – LearnerEarner

0

Ein einfacher Weg, dies zu erreichen, ist die Verwendung von setInterval(), um den Server alle paar Sekunden nach neuen Benachrichtigungen abzufragen. Der Code würde wie folgt aussehen:

HTML

<li class="dropdown"> 
<a href="#" class="dropdown-toggle notification-toggle" data-toggle="dropdown" role="button" aria-expanded="false" id="button"> 
    <div id='inbox-wrapper'><span class='glyphicon glyphicon-inbox' aria-hidden="true"></span><div> 
    <span class="caret"></span> 
    <span class="badge badge-notify">notification count</span></a> 
    <ul class="dropdown-menu" role="menu" id='notification_dropdown'></ul> 
</li> 

JS

<script> 
    setInterval(function(){ 
    $.ajax({ 
      type: "POST", 
      url: "{% url 'get_notifications_ajax' %}", 
      data: { 
      csrfmiddlewaretoken: "{{ csrf_token }}", 
      }, 
     success: function(data){ 
      $("#notification_dropdown").html(' <li role="presentation" class="dropdown-header">alarm</li>'); 
      var count = data.count 
      console.log(count) 
      if (count == 0) { 
        $("#notification_dropdown").removeClass('notification'); 
       var url = '{% url "notifications_all" %}' 
       $("#notification_dropdown").append("<li><a href='" + url+ "'>view all</a></li>") 
       // here we change the inbox appearance 
       $("#inbox-wrapper").html("<span class='glyphicon glyphicon-inbox' aria-hidden='true'></span>"); 
      } else { 
        $("#notification_dropdown").addClass('notification'); 
       $(data.notifications).each(function(){ 
       var link = this; 
       $("#notification_dropdown").append("<li>" + link + "</li>") 
       // change the inbox appearance 
       $("#inbox-wrapper").html("<span class='badge badge-notify' style='background-color:red'>" + count + "</span>"); 
       }) 
      } 
      console.log(data.notifications); 
      }, 
      error: function(rs, e) { 
      console.log(rs); 
      console.log(e); 
      } 
     }); 
    }, 5000); 
</script> 

Ich habe die folgenden Änderungen an Ihrem Code:

1) Ich habe ein div mit einer ID zum Umbruch des Posteingangs, um das HTML - Swapping einfacher zu machen (z. B. Nun, ich habe das Stil-Attribut für den 'aktiven' Posteingang span)

2) Ich habe den Code aus dem Posteingang Click-Ereignis in eine setInterval Funktion. Auf diese Weise müssen Sie die AJAX-Anfrage nicht senden, wenn Sie das Dropdown-Menü für den Posteingang öffnen, da Sie dies bereits alle 5 Sekunden getan haben!

3) Ich habe die Benachrichtigung Zählung in den Posteingang Element

+0

Hallo, wie ich Ihren Code gelesen habe, verstehe ich es irgendwie, aber wenn ich im Grunde versucht, kopiert und eingefügt Ihren Code kann ich die Benachrichtigungsbox nicht entfalten. .Ich sah die Konsole, aber kein Fehler ... sorry könnte nicht ausführlicher sein ... vielleicht werde ich das Bild, was es aussieht –

+0

Ich wollte nur einen Schub in die richtige Richtung geben, offensichtlich werden Sie müssen HTML und Code an Ihre spezifischen Gegebenheiten anpassen. – ygesher

Verwandte Themen