2016-04-11 11 views
1

Ich kenne zwei Wege-Controller in AngularJS zu erklären und zu definieren:AngularJS: Wie injiziere ich ein Objekt in den Controller?

1. Weg:

myApp.controller('myController', ['$scope', '$uibModal', myController]); 

function myController($scope, $uibModal, myObject){ 
    $scope.params = {}; 
    $scope.open = function(){ 
     $uibModal.open({ 
      templateUrl:'my_dialig.html', 
      controller:myDialogController, 
      resolve:{ 
       myObject:function(){ 
       return $scope.params; 
       } 
      } 
     }); 
    } 
} 

2. Art und Weise:

myApp.controller('myController', function($scope, $uibModal){ 
    $scope.params = {}; 
    $scope.open = function(){ 
    $uibModal.open({ 
     templateUrl:'my_dialog.html', 
     controller:myDialogController, 
     resolve:{ 
      myObject:function(){ 
       return $scope.params; 
      } 
     } 
    }); 
    } 
}); 

Wo ich myObject:

... 

myApp.controller('myDialogController', function($uibModalInstance, myObject){ 
    console.log(myObject); 
} 
... 

Dies ist der UI Bootstrap Modal Dialog Code und das Objekt t von resolve zurückgegeben wird, sind die Daten, die an den Dialogbereich übergeben werden sollen.

Aber das Problem kommt:

der erste Weg:

nicht durch AngularJS erlaubt werden, weil es nicht die Definition von myObject in myDialogController finden.

der zweite Weg:

der Wert im Protokoll ausgedruckt: 'undefined'.

Ist die Art, wie ich den Controller deklarieren und definieren falsch (die anderen Teile des Controller-Code funktionieren nur ok), oder ist die Art und Weise myObject Controller falsch übergeben? (Der Code zur Verwendung des Controllers ist von AngularJS UI Bootstrap-Beispielcode: "https://angular-ui.github.io/bootstrap/").

Der Fehler, den ich mache, mag albern vorkommen, aber es ist mir wichtig, danke, dass ich es herausgefunden habe!

+0

Wo Sie die 'resolve' haben? – Joy

+0

@Joy, in https://angular-ui.github.io/bootstrap/, Modalteil, heißt es: resolve (Type: Object) - Mitglieder, die aufgelöst und als Locals an den Controller übergeben werden; Dies entspricht der Eigenschaft resolve im Router. – Al2O3

+0

Ich würde vorschlagen, es lebendig zu machen auf JSFiddle/Plunker/Pen – Joy

Antwort

0

Was ist das myObject? Winkelinjektor kann das Objekt nur in Winkelrichtung injizieren (wie myController, definiert durch app.controller). Also sollten Sie Ihr myObject in eckiges Objekt umwandeln, Service oder Fabrik ist in Ordnung.

myApp.service("myObject", function() { 
    ... 
}) 

Wenn Sie selbst einen Gegenstand injizieren wollen, können Sie die $ Controller wie folgt verwenden:

$controller("myController", {myObject: myObject}); 

hier ist die Dokumentation: $controller

+0

Ich kann Fabrik oder Service verwenden, aber ich denke, das Design ist nicht gut, in der Tat die Daten an den Dialog übergeben, ist nur Artikel-ID ausgewählt. Und der Code sollte gut funktionieren wie der Beispielcode von 'Modal' Teil in: https://angular-ui.github.io/bootstrap/ – Al2O3

+0

Antwort aktualisiert. UI Bootstrap injiziert die Instanz über den $ Controller. – xierui

0

sieht aus wie Sie wollen einfach nur passieren $ scope.params zum Dialogcontroller. Wenn dies der Fall ist, müssen Sie myObject nicht in myController injizieren.

myApp.controller('myController', function($uibModal){ 
    $scope.params = {}; 
    $scope.open = function(){ 
    $uibModal.open({ 
     templateUrl:'my_dialog.html', 
     controller:myDialogController, 
     resolve:{ 
      myObject:function(){ 
      return $scope.params; 
      } 
     } 
    }); 
    } 
}); 
+0

Ich habe myedits verbessert, (die Verwendung von myObject ist in myDialogController) – Al2O3

+0

erhalten Sie immer noch undefiniert, wenn Sie den Dialog öffnen? – sdfacre

0

Sie sollten in einen Controller zu injizieren, eine Konstante ein service or constant zu erstellen, wenn Ihr Objekt konstant (DUH) und ein Service ist, wenn es Daten enthält, dynamisch (Funktionen als Werte) benötigen.

so ...

myApp.service('myObject', function(){ 
    return { 
     function(){ 
      ... 
     }, 
     .... 
    } 
}) 

oder

myApp.constant('myObject', { 
    'someKey': 'someValue', 
    ... 
}) 
+0

der Code sollte die Daten durch 'Auflösen' umgehen, siehe Code in; https://angular-ui.github.io/bootstrap/ – Al2O3

+0

Sie übergeben eine Funktion als 'myObject', kein Objekt, also vielleicht so etwas wie: myObject: { getParams: function() {return $ scope.params} } – northsideknight

+0

Wenn ich 'myObject()' verwende, protokolliert es 'myObject ist keine Funktion' – Al2O3

Verwandte Themen