Ich habe eine Zeichenfolge, die ich von einem routeParam
- oder einem Direktionsattribut oder was auch immer erhalten habe, und ich möchte auf dieser Grundlage eine Variable für den Geltungsbereich erstellen. So:
$scope.<the_string> = "something".
Wenn die Zeichenfolge jedoch einen oder mehrere Punkte enthält, möchte ich sie aufteilen und tatsächlich in den Geltungsbereich hineinziehen. 'foo.bar'
sollte also $scope.foo.bar
werden. Dies bedeutet, dass die einfache Version nicht funktioniert!
// This will not work as assigning variables like this will not "drill down"
// It will assign to a variables named the exact string, dots and all.
var the_string = 'life.meaning';
$scope[the_string] = 42;
console.log($scope.life.meaning); // <-- Nope! This is undefined.
console.log($scope['life.meaning']); // <-- It is in here instead!
Wenn Sie eine Variable lesen, die auf einer Zeichenfolge basiert, können Sie dieses Verhalten durch Ausführen von $scope.$eval(the_string)
erhalten, aber wie wird dies beim Zuweisen eines Werts ausgeführt?
Die Lösung, die ich gefunden habe, ist die Verwendung von $ parse .
"Konvertiert den Angular-Ausdruck in eine Funktion."
Wenn jemand eine bessere hat, fügen Sie bitte eine neue Antwort auf die Frage hinzu!
Hier ist das Beispiel:
var the_string = 'life.meaning';
// Get the model
var model = $parse(the_string);
// Assigns a value to it
model.assign($scope, 42);
// Apply it to the scope
// $scope.$apply(); <- According to comments, this is no longer needed
console.log($scope.life.meaning); // logs 42
Mit Eriks Antwort als Ausgangspunkt. Ich habe eine einfachere Lösung gefunden, die für mich funktioniert hat.
In meiner Ng-Click-Funktion habe ich:
var the_string = 'lifeMeaning';
if ($scope[the_string] === undefined) {
//Valid in my application for first usage
$scope[the_string] = true;
} else {
$scope[the_string] = !$scope[the_string];
}
//$scope.$apply
Ich habe es mit und ohne $ scope getestet. Funktioniert ohne es richtig!
Erstellen Sie dynamische Winkelvariablen aus Ergebnissen
angular.forEach(results, function (value, key) {
if (key != null) {
$parse(key).assign($scope, value);
}
});
ps. Vergessen Sie nicht, das $ parse-Attribut in die Funktion Ihres Controllers zu übergeben
Wenn Sie mit Lodash zufrieden sind, können Sie mit _.set () das tun, was Sie wollten, in einer Zeile:
_.set (Objekt, Pfad, Wert) Legt den Eigenschaftswert des Pfads für das Objekt fest. Wenn ein Teil des Pfads nicht vorhanden ist, wurde er erstellt.
Ihr Beispiel wäre also einfach: _.set($scope, the_string, something);
Nur um gegebene Antworten voranzubringen, funktionierte für mich Folgendes:
HTML:
<div id="div{{$index+1}}" data-ng-show="val{{$index}}">
Dabei ist $index
der Schleifenindex.
Javascript (wobei value
der übergebene Parameter an die Funktion ist und der Wert von $index
, der aktuelle Schleifenindex ist):
var variable = "val"+value;
if ($scope[variable] === undefined)
{
$scope[variable] = true;
}else {
$scope[variable] = !$scope[variable];
}
Bitte beachten Sie: Dies ist nur eine JavaScript-Sache und hat nichts mit Angular JS zu tun. Seien Sie also nicht verwirrt über das magische '$' Zeichen;)
Das Hauptproblem ist, dass dies eine hierarchische Struktur ist.
console.log($scope.life.meaning); // <-- Nope! This is undefined.
=> a.b.c
Dies ist undefiniert, da "$ scope.life" nicht existiert, der obige Begriff jedoch "Bedeutung" lösen möchte.
Eine Lösung sollte sein
var the_string = 'lifeMeaning';
$scope[the_string] = 42;
console.log($scope.lifeMeaning);
console.log($scope['lifeMeaning']);
oder mit etwas mehr Aufwand.
var the_string_level_one = 'life';
var the_string_level_two = the_string_level_one + '.meaning';
$scope[the_string_level_two ] = 42;
console.log($scope.life.meaning);
console.log($scope['the_string_level_two ']);
Da kann mit auf ein Strukturobjekt zugegriffen werden
var a = {};
a.b = "ab";
console.log(a.b === a['b']);
Es gibt einige gute Tutorials, die Sie gut durch den Spaß mit JavaScript führen.
Es gibt etwas an der
$scope.$apply();
do...somthing...bla...bla
Suchen Sie im Web nach 'angle $ apply' und finden Sie Informationen zur $ apply-Funktion. Und Sie sollten weise mehr auf diese Weise verwenden (wenn Sie nicht bereits mit einer $ apply-Phase vertraut sind).
$scope.$apply(function (){
do...somthing...bla...bla
})
Wenn Sie die Lodash-Bibliothek verwenden, können Sie im Winkelbereich eine dynamische Variable festlegen.
Den Wert im Winkelbereich einstellen.
_.set($scope, the_string, 'life.meaning')
Um den Wert aus dem Winkelbereich zu erhalten.
_.get($scope, 'life.meaning')