2016-03-30 5 views
0

Ich benutze einen Favoriten-Button zu meinem Projekt. Hier ist ein demoSpeichere die ID im lokalen Speicher mit der Taste angularjs

script.js

angular.module("MyApp",[]); 

service.js

angular 
.module("MyApp") 
.service("FavoriteService",[function(){ 


//Favorites functions 
this.isLocalStorageEnable = function() { 

    if(typeof (Storage) !== "undefined"){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
}; 

this.isFavorite = function(scope){ 
    var fav = localStorage.getItem(scope.id); 
    return fav === "1"; 
}; 


this.setFav = function(scope){ 
    localStorage.setItem(scope.id,"1"); 

}; 


this.deleteFav = function(scope){ 
    localStorage.removeItem(scope.id); 

}; 


}]); 

directive.js

angular.module("MyApp").directive("albumDirective", ["FavoriteService", function(FavoriteService) { 

return { 
restrict: "AE", 
templateUrl: "AlbumDirective.html", 
replace: true, 
scope: { 
    id: "=albumId" 
}, 
    link: function(scope) 
    { 
     scope.isLocalStorageEnable = FavoriteService.isLocalStorageEnable; 
     scope.isFavorite = FavoriteService.isFavorite(scope); 

    scope.markAs = function(type) { 
     switch(type) { 
     case true : 
      FavoriteService.setFav(scope); 
      break; 
     case false : 
      FavoriteService.deleteFav(scope); 
      break; 

     } 
     scope.isFavorite = type; 
    } 

} 

    }; 

    }]); 

AlbumDirective.html

 <button ng-click="markAs(!isFavorite)" ><i class="fa" ng-class="{'fa-heart' : isFavorite , 'fa-heart-o' : !isFavorite }"></i></button> 

Itempage.html

<album-directive album-id="1"></album-directive> 

Wenn ich für das Herz klicken in ItemPage.html für Punkt 1 der Button aktiv und wenn ich wieder für Artikel zu ItemPage.html Ebene 2 die Taste ist bereits active.In Jede Artikelseite habe ich {{object.itemid}}. Ich möchte die Artikel-ID zum lokalen Speicher hinzufügen, so dass die Schaltfläche nur aktiv ist, wenn die Schaltfläche für jeden Artikel gedrückt wird. Ich habe nie lokalen Speicher verwendet. Irgendwelche Vorschläge? Vielen Dank im Voraus.

+0

was ist der Artikel-ID für item2? Ihr Beispiel scheint gut zu funktionieren und es sollte kein Problem geben, solange jeder Artikel eine andere ID hat. – S4beR

+0

Der Artikel 1 hat itemid = 1, der item1 hat itemid = 2 wenn ich auf der Artikelseite bin und den Artikel 1 anschaue und auf den Link klicke Taste, um das Element1 zum Favoriten zu setzen, ist Arbeit. Wenn ich jedoch zurück gehe, gehe zu itempage.html, um den item2 zu sehen, der Button ist bereits aktiv. Es gibt also nur einen Status für alle Elemente (aktiv oder nicht). Ich brauche einen Zustand für jeden Gegenstand. –

Antwort

0

Antonis,

Angular Dienste sind Singletons und daher nur einmal durch den gesamten Lebenszyklus der Anwendung instanziiert werden. Das heißt, sie eignen sich hervorragend zum Speichern und Freigeben von Daten über Controller hinweg.

Local Storage

The localStorage object speichert die Daten ohne Verfallsdatum. Die Daten werden nicht gelöscht, wenn der Browser geschlossen wird, und sind am nächsten Tag, in der nächsten Woche oder im nächsten Jahr verfügbar.

Daher das Verhalten. Das Öffnen mehrerer Webseiten wird auf denselben lokalen Speicher zugreifen, der selbst ein Singleton ist.

Der Unterschied ist, dass mit eckigen jede Seite, die geöffnet ist, eine eigene Instanz der Anwendung hat. Daher hat jede Webseite ihre eigene Instanz des Dienstes.

Lösung

Here is the plunker

Der Kodex

angular.module("MyApp").service("FavoriteService",[function(){ 


    this.fav = 0; 

    //Favorites functions 
    this.isLocalStorageEnable = function() { 

     if(typeof (Storage) !== "undefined"){ 
      return true; 
     } 
     else{ 
      return false; 
     } 
    }; 

    this.isFavorite = function(scope){ 
     return this.fav === 1; 
    }; 

    this.setFav = function(){ 
     this.fav = 1; 

    }; 

    this.resetFav = function(){ 
     this.fav = 0; 

    }; 

}]); 
+0

Vielen Dank für Ihre Antwort. Diese Lösung löst das Problem nicht.Ich habe bereits das gleiche Problem (die Schaltfläche ist auf allen Seiten aktiv), auch jetzt ist die Schaltfläche aktiv und beim erneuten Klicken bleibt sie aktiv. –

+0

Ich verwende den Plumbing in Chrome und es funktioniert wie ein Zauber.Verwenden Sie diesen Plünderer: http://plnkr.co/edit/MdtaYFTIKdiFz4csTF5O?p=preview –

+0

ja. Wenn ich auf den Button aktiv werde und dann für alle Artikel aktiv ist –