angular-ui bootstrap $modal de service à l'aide de la directive au lieu
Les exemples que je vois de l'aide angular-ui/bootstrap est $modal
toujours ressembler à quelque chose comme ceci:
$modal.open({
templateUrl: 'modaltemplate.html',
controller: function($scope) {
...
}
});
Que faire si je veux utiliser une directive, à la place? Comme ceci:
$modal.open({
template: '<my-modal-directive></my-modal-directive>'
//no "controller" property; use directive's controller
});
Le balisage de my-modal-directive
rend très bien, et j'ai déplacé le controller
la propriété dans le my-modal-directive
définition de l'objet, mais maintenant cette erreur de la my-modal-directive
:
Error: [$injector:unpr] Unknown provider: $modalInstanceProvider <- $modalInstance
Quelqu'un peut-il m'indiquer un exemple où $modal
utilise une directive, lorsque cette directive définit le controller
?
Par exemple, ce qui fonctionne, où j'ai remplacé le templateUrl
avec une directive:
http://plnkr.co/edit/YrGaF83GH6bzZPRR55GK?p=preview
Mais quand je bouge la manette à partir de $modal.open()
dans la directive, c'est lorsque l'erreur se produit:
http://plnkr.co/edit/aLBT239EpL004DRh4jll?p=preview
À l'aide de
$modal
dans le contrôleur qui lance le modal. À l'aide de $modalInstance
dans le my-modal-directive
's contrôleur. 🙂Je ne comprends pas pourquoi u pense que c'est possible et pourquoi u besoin. L'ajout de la directive modal (1ère étape) est clair et ordinaire, mais la 2ème?
Que Sergiu points, angular-ui bootstrap utilise un impératif approche. La définition d'un modèle et contrôleur inline avec
$modal.open()
contre l'encapsulation de ce qui est ouvert dans une directive unique n'est pas une bonne conception. Vous avez fragmenté que le modal est par le casser en deux morceaux séparés--un modèle, et un contrôleur. L'Encapsulation est un meilleur modèle que la composition dans ce cas, à mon avis. À l'aide d'une directive qui est un composant (c'est à dire isoler portée, modèle, contrôleur de tous dans la directive définition) pour le modal pour le lancement, doit être privilégiée.OriginalL'auteur core | 2015-02-18
Vous devez vous connecter pour publier un commentaire.
Le problème que vous avez est que vous essayez d'injecter des valeurs qui ne sont pas disponibles pour l'injection. Seules les valeurs inscrit auprès de l'injecteur peut être injecté.
La logique de vous code est également une erreur, vous créez le modal dans votre contrôleur principal, mais en essayant de le fermer dans la directive. Idéalement, le modal doit être déclenchée par la directive (via la fonction de lien), et vous pouvez alors ok/annuler à partir de là.
Voir mon http://plnkr.co/edit/3p1rXAymd7BilyklgxKy?p=preview pour une approche possible, j'ai gardé le code qui se ferme et annule le modal dans le contrôleur principal.
$modal
s contrôleur.Oui, tant que vous n'avez vraiment pas moyen d'y avoir accès dans vos directives modèle/contrôleur.
Oui, vous l'avez: plnkr.co/modifier/5wV6XTtkhnZkmhETBjkv?p=preview
Légère confusion que moi si vous entend l'accès à l' $modal contrôleur, et pas d'accès à portée des variables. Je continue de penser qu'il serait préférable de créer une directive à laquelle vous pouvez passer d'un modèle, et ok/fermer méthodes via les attributs de la directive. Si j'ai le temps je pourrais créer un adapté à la directive.
Ouais, vous avez raison, ce serait la solution la plus élégante façon, l'encapsulation de l'ensemble de la
$modal
et$modalInstance
code dans une auto-contenu de la directive. Je pense que le plus "impératif" de l'API bootstrap-ui expose est une mauvaise pratique et à l'encontre de ce que AngularJS plaide pour.OriginalL'auteur thedoctor
Le problème est que
$modalInstance
ne peut être injecté dans le contrôleur que vous fournissez à$modal.open
.Vérifiez les sources ici:
En essence lorsque vous essayez d'ajouter
$modalInstance
comme une dépendance à votre contrôleur AngularJS regarde pour un fournisseur mondial nommé$modalInstanceProvider
. Maintenant, le problème est, si vous avez compris le code ci-dessus, que$modalInstance
est pas a enregistré globalement fournisseur. Il ne "existe" en tant que dépendance pour le contrôleur de passer$modal.open
.Si vous lisez le reste du code, vous remarquerez que
$modal.open
retournemodalInstance
, peut-être que vous pouvez l'utiliser.Quelque chose comme cette:
OriginalL'auteur Sergiu Paraschiv
- Je créer une directive visant à créer des modaux facilement. Un modal contenu est basé sur un modèle de vue.
Exemple comment l'utiliser:
index.html
hello.html
HelloCtrl.js
Modale vue peut avoir son propre contrôleur. Exemple:
hello.html (modifié)
Hello2Ctrl.js
Observer que le modal sortie sera "Bonjour Worldsszz Xico", parce que le modal contrôleur (HelloCtrl) sera rendue après-vue-contrôleur (Hello2).
Référence
OriginalL'auteur Fernando Felix
C'est encore plus de retard de réponse, mais quelqu'un peut trouver utile.
J'ai amélioré Fernando Felix réponse et fait mon propre assez souple directive, qui communique avec le contrôleur, qui, je pense, pourrait être une solution pour cette question.
Directive
Contrôleur
inline modèle
C'est un contrôleur et le modèle par déroulant type, alors vous pouvez l'appeler plusieurs fois avec:
Vous pouvez initialiser la valeur, quelle que soit ie. objet, tableau etc.
ou externe modèle
À peu près la même, il suffit de changements de l'url et le fichier de modèle est utilisé pour le modèle.
test1.html
Taille modale etc.
Juste ajouter un paramètre size="sm|lg" pour le modal lien/bouton ie.
Cliquez ici pour ouvrir le modal
Pour la taille standard, passez le paramètre.
Vous pouvez améliorer vous-même en utilisant le lien fonction attrs.
OriginalL'auteur Karol Websky
Je suis kanda fin de relecture mettre de la façon la plus simple est d'utiliser
Cela fonctionne de la forme de votre directive contrôleur.
OriginalL'auteur Dimpu Aravind Buddha