Problème de portée dans AngularJS à l'aide de AngularUI Modal Bootstrap
plunker: http://plnkr.co/edit/wURNg8ByPYbEuQSL4xwg
example.js:
angular.module('plunker', ['ui.bootstrap']);
var ModalDemoCtrl = function ($scope, $modal) {
$scope.open = function () {
var modalInstance = $modal.open({
templateUrl: 'modal.html',
controller: 'ModalInstanceCtrl'
});
};
};
var ModalInstanceCtrl = function ($scope, $modalInstance) {
$scope.ok = function () {
alert($scope.text);
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
};
index.html:
<!doctype html>
<html ng-app="plunker">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js"></script>
<script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.6.0.js"></script>
<script src="example.js"></script>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
</head>
<body>
<div ng-controller="ModalDemoCtrl">
<button class="btn" ng-click="open()">Open me!</button>
<div ng-show="selected">Selection from a modal: {{ selected }}</div>
</div>
</body>
</html>
modal.html:
<div class="modal-header">
<h3>I'm a modal!</h3>
</div>
<textarea ng-model="text"></textarea>
<div class="modal-footer">
<button class="btn btn-primary" ng-click="ok()">OK</button>
<button class="btn btn-warning" ng-click="cancel()">Cancel</button>
</div>
Pourquoi je ne peux pas obtenir le $scope.texte défini dans ModalInstanceCtrl, même si je peux utiliser $champ d'application.ok et $champ d'application.annuler?
- C'est parce que vous êtes alerte $champ d'application.texte avant la cession. Il suffit d'écrire
$scope.text = "abc";
dans votre contrôleur et vous allez voir que dans l'alerte. - L'entrée vient de modal.html. Veuillez voir le plunker.
- Oups! Désolé à ce sujet. Jetez un oeil à ma réponse.
- QuantumUI modal est plus flexiable et avoir une bonne documentation. Vous pouvez l'essayer (angularui.net)
Vous devez vous connecter pour publier un commentaire.
Ressemble à un problème de portée. Je l'ai eu à travailler comme ça:
HTML:
$scope.input = {};
il fixe. Chose étrange cependant.$scope.input="";
pas de travail?ok(text)
. En fait, de plus en plus puissants dans le long terme.Mise à jour Novembre 2014: le problème est résolu avec angular-ui-bootstrap 0.12.0 - la transclusion portée est fusionné avec le contrôleur de la portée. Il n'y a pas besoin de faire quoi que ce soit. Juste rester avec:
Avant 0.12.0:
Angular-UI les auxiliaires modaux sont à l'aide de transclusion de joindre modal de contenu, ce qui signifie que toutes les nouvelles entrées faites dans les modaux sont créés dans enfant.
Vous devez utiliser l'héritage et initialiser vide
text
entrée dans le parent$scope
ou vous pouvez explicitement joindre l'entrée à la portée parent:
Me laisser tenter d'expliquer la raison. ui-modal bootstrap source:
et le modèle de code source - window.html:
il existe une directive modal-transclude,votre boîte de dialogue contenu s'insérer en elle, c'est le code source:
})
maintenant, jetez un oeil à la doc officiel de $compiler:
transclude permettra de créer un nouveau champ d'application de contrôleur de portée