wake-up-neo.com

Festlegen von dynamischen Bereichsvariablen in AngularJs - Bereich. <Some_string>

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?

92
Erik Honn

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
168
Erik Honn

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! 

17
Andrew Gray

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

13
Demodave

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.

https://lodash.com/docs#set

Ihr Beispiel wäre also einfach: _.set($scope, the_string, something);

5
NorthernStar

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];
}
3
Riaz

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
})
2
Raxa

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')
0
Sagar Vaghela