Verwenden Sie Eckige zu kopieren Objekt-Eigenschaften - ohne Werte - zu einem anderen Objekt
Wir haben versucht, eckig.kopieren und eckig.erweitern. Diese beiden, obwohl, kopieren Immobilien-Werte. Wie kopieren wir die Eigenschaften eines Objekts, ohne Ihre Werte, um ein anderes Objekt?
Hier ist ein fiddle mit unseren versuchen, basierend auf wie-zu-schnell-klar-ein javascript-Objekt.
angular.module('App', []);
function Ctrl($scope) {
function copyNotValues(obj) {
var newObj = angular.copy(obj);
for (prop in newObj) {
if(newObj.hasOwnProperty(prop))
{
newObj[prop] = null;
}
};
return newObj;
}
$scope.master = {
foo: 'original foo',
bar: 'original bar'
};
$scope.copy = angular.copy($scope.master);
$scope.extend = angular.extend($scope.master);
$scope.copyNotValues = copyNotValues($scope.master);
}
InformationsquelleAutor Shaun Luttin | 2014-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
JavaScript nicht über das Konzept von Klassen. Er verwendet Prototype-Vererbung, was bedeutet, können Sie nur erstellen Sie ein neues Objekt durch kopieren von einem anderen Objekt. Wenn Sie tun, dass Sie die Eigenschaften.
Können Sie dies umgehen, indem die Erstellung einer "master" - Objekt ohne Werte. So etwas wie dieses:
Dann können Sie neu erstellen 'Instanzen' des Objekts mit dem new-Schlüsselwort:
Wenn Sie müssen zum erstellen einer neuen Instanz des Objekts, gehen Sie zurück zu der ursprünglichen, nicht Ihre Kopie:
Dies ist wirklich ein JavaScript-Problem und nicht ein Eckiges Problem. Ich nehme an, man könnte theoretisch eine Funktion schreiben, erstellen Sie eine neue Instanz eines Objekts und dann die Schleife über die Eigenschaften, die Sie alle setzen auf null oder leere Zeichenfolgen.
In meinem ActionScript-Erfahrung; es machte eine Menge Sinn, um doppelte Objekte auf der server-Seite und in der client. Aber da JavaScript ist eine lose typisierte Sprache, du hast wahrscheinlich Recht, dass der Aufwand nicht sinnvoll. Ich bin mir ziemlich sicher, dass eine for each-Schleife wird Ihnen alle Eigenschaften eines Objekts; und Sie sollten in der Lage sein, um Kapseln, die in eine utility-Funktion für eine einfache Wiederverwendung. Viel Glück!
Tolle Tipps! Wir sind bereits das duplizieren der Objekte auf der server-Seite und client. Auf dem server, wir haben beide ein verbindliches Modell und ein view-Modell. Und auf dem client haben wir das ng-Modell, das es in der HTML-Vorlage. Wenn wir auch duplizieren Sie das Modell in der ng-controller, dann hätten wir vier Darstellungen des gleichen Modells! Drei scheint genug overhead, wie Sie erwähnen. Die JavaScript-for-Schleife hat den trick in eine utility-Funktion, die wir in ein Eckiges service. Danke für die Ermutigung!
Ich verstehe die Verwendung eckig.copy() in diesem Fall. Allerdings, wenn ich versuchte die Schaffung Instanz den Weg JeffryHouser erwähnt, ich erhalte eine Fehlermeldung, die sagt master ist kein Konstruktor. Alles, was ich bin fehlt?
Ohne zu sehen, eine Probe; ich bin mir nicht sicher. Können Sie gemeinsam einen Plunker demonstriert das problem?
InformationsquelleAutor JeffryHouser