Ich habe Probleme, die Bereiche für ein eckiges UI-Modal zu verstehen / zu verwenden.
Obwohl dies hier nicht sofort ersichtlich ist, habe ich die Module und alles richtig eingerichtet (soweit ich das beurteilen kann), aber gerade in diesen Codebeispielen finde ich den Fehler.
index.html (der wichtige Teil davon)
<div class="btn-group">
<button class="btn dropdown-toggle btn-mini" data-toggle="dropdown">
Actions
<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-right text-left">
<li><a ng-click="addSimpleGroup()">Add Simple</a></li>
<li><a ng-click="open()">Add Custom</a></li>
<li class="divider"></li>
<li><a ng-click="doBulkDelete()">Remove Selected</a></li>
</ul>
</div>
Controller.js (wieder der wichtige Teil)
MyApp.controller('AppListCtrl', function($scope, $modal){
$scope.name = 'New Name';
$scope.groupType = 'New Type';
$scope.open = function(){
var modalInstance = $modal.open({
templateUrl: 'partials/create.html',
controller: 'AppCreateCtrl'
});
modalInstance.result.then(function(response){
// outputs an object {name: 'Custom Name', groupType: 'Custom Type'}
// despite the user entering customized values
console.log('response', response);
// outputs "New Name", which is fine, makes sense to me.
console.log('name', $scope.name);
});
};
});
MyApp.controller('AppCreateCtrl', function($scope, $modalInstance){
$scope.name = 'Custom Name';
$scope.groupType = 'Custom Type';
$scope.ok = function(){
// outputs 'Custom Name' despite user entering "TEST 1"
console.log('create name', $scope.name);
// outputs 'Custom Type' despite user entering "TEST 2"
console.log('create type', $scope.groupType);
// outputs the $scope for AppCreateCtrl but name and groupType
// still show as "Custom Name" and "Custom Type"
// $scope.$id is "007"
console.log('scope', $scope);
// outputs what looks like the scope, but in this object the
// values for name and groupType are "TEST 1" and "TEST 2" as expected.
// this.$id is set to "009" so this != $scope
console.log('this', this);
// based on what modalInstance.result.then() is saying,
// the values that are in this object are the original $scope ones
// not the ones the user has just entered in the UI. no data binding?
$modalInstance.close({
name: $scope.name,
groupType: $scope.groupType
});
};
});
create.html (in seiner Gesamtheit)
<div class="modal-header">
<button type="button" class="close" ng-click="cancel()">x</button>
<h3 id="myModalLabel">Add Template Group</h3>
</div>
<div class="modal-body">
<form>
<fieldset>
<label for="name">Group Name:</label>
<input type="text" name="name" ng-model="name" />
<label for="groupType">Group Type:</label>
<input type="text" name="groupType" ng-model="groupType" />
</fieldset>
</form>
</div>
<div class="modal-footer">
<button class="btn" ng-click="cancel()">Cancel</button>
<button class="btn btn-primary" ng-click="ok()">Add</button>
</div>
Meine Frage lautet also: Warum ist der Bereich nicht doppelt an die Benutzeroberfläche gebunden? und warum hat this
die angepassten Werte, aber $scope
nicht?
Ich habe versucht, ng-controller="AppCreateCtrl"
das Body-Div in create.html hinzuzufügen, aber das hat einen Fehler ausgelöst: "Unbekannter Anbieter: $ modalInstanceProvider <- $ modalInstance", also kein Glück.
An diesem Punkt besteht meine einzige Möglichkeit darin, ein Objekt mit this.name
und this.groupType
anstatt zu verwenden $scope
, aber das fühlt sich falsch an.
Antworten:
Ich habe meine dazu gebracht, so zu arbeiten:
var modalInstance = $modal.open({ templateUrl: 'partials/create.html', controller: 'AppCreateCtrl', scope: $scope // <-- I added this });
Kein Formularname, nein
$parent
. Ich verwende AngularUI Bootstrap Version 0.12.1.Dadurch wurde ich auf diese Lösung hingewiesen .
quelle
Wenn verschachtelte Bereiche betroffen sind, binden Sie
<input>
s nicht direkt an Mitglieder des Bereichs:<input ng-model="name" /> <!-- NO -->
Binden Sie sie mindestens eine Ebene tiefer:
<input ng-model="form.name" /> <!-- YES -->
Der Grund dafür ist, dass Bereiche prototypisch ihren übergeordneten Bereich erben. Wenn Sie also Mitglieder der ersten Ebene festlegen, werden diese direkt im untergeordneten Bereich festgelegt, ohne dass dies Auswirkungen auf die übergeordneten Elemente hat. Im Gegensatz dazu wird
form.name
das Mitglied beim Binden an verschachtelte Felder ( )form
aus dem übergeordneten Bereich gelesen, sodass beim Zugriff auf diename
Eigenschaft auf das richtige Ziel zugegriffen wird.Lesen Sie eine ausführliche Beschreibung hier .
quelle
controller as
Syntax verwenden, werden Sie nicht auf solche Probleme mit verschachtelten Bereichen stoßencontroller as
Syntax?Update November 2014 :
Eigentlich sollte Ihr Code nach dem Upgrade auf ui-bootstrap 0.12.0 funktionieren. Der transkludierte Bereich wird mit dem Bereich des Controllers zusammengeführt, sodass kein Bedarf
$parent
oderform.
ähnliches mehr besteht.Vor 0.12.0 :
Das Modal verwendet die Transklusion, um seinen Inhalt einzufügen. Dank
ngForm
können Sie den Bereich nachname
Attributen steuern . Um dem ausgeschlossenen Bereich zu entkommen, ändern Sie das Formular einfach folgendermaßen:<form name="$parent">
oder
<form name="$parent.myFormData">
Die Modelldaten werden im Controller-Bereich verfügbar sein.
quelle
$modal
, für den Controller verfügbar sein sollte, der dem Modal zugewiesen ist?scope:$scope
$ modal.open params map ein.$scope.open = function () { var modalInstance = $uibModal.open({ animation: $scope.animationsEnabled, templateUrl: 'myModalContent.html', controller: 'salespersonReportController', //size: size scope: $scope }); };
es funktioniert für mich scope: $ scope danke u Jason Swett
quelle
Ich füge scope hinzu: $ scope dann funktioniert es .Cool
quelle