Comment appeler la méthode d'un composant à partir d'un contrôleur
J'ai un composant qui représentent une carte et après une action dans mon contrôleur, je tiens à appeler une méthode sur le composant pour le centre de la carte. Le code ressemble à ceci
App.PlacesController = Ember.Controller.extend({
actions : {
centerMap : function () {
//how to call from here to GoogleMapComponent.centerMap ??
}
}
});
App.GoogleMapComponent = Ember.Component.extend({
centerMap : function () {
}
});
modèle
{{google-map}}
<button {{action "centerMap"}}>Center Map</button>
J'ai trouvé une solution de contournement, mais je ne pense pas que ce soit la Braise moyen de le faire.
{{google-map viewName="mapView"}}
<button class="center-map">Center Map</button>
App.PlacesView = Ember.View.extend({
didInsertElement : function () {
this.$(".center-map").click(this.clickCenterMap.bind(this));
},
clickCenterMap : function () {
this.get("mapView").centerMap();
}
});
Vous devez vous connecter pour publier un commentaire.
Dans la Braise, points de vue (les Composants sont glorifiés vues) connaissent leur contrôleur, mais les contrôleurs ne sais PAS à propos de points de vue. C'est par la conception (MVC) pour garder les choses découplé, et donc vous pouvez avoir de nombreux points de vue qui sont "alimentés" par un seul contrôleur et le contrôleur est pas plus sage. Donc lorsque vous pensez à propos de la relation, des changements peuvent se produire à un contrôleur et une vue de réagir à ces changements. Donc, juste pour rappeler, vous ne devriez jamais tenter d'accéder à une vue de composant/depuis un contrôleur.
Il ya quelques options que je pense lorsque vous traitez avec votre exemple.
Faire le bouton de la partie de votre composant! Les composants sont conçus pour gérer la saisie de l'utilisateur, comme le clic sur un bouton, de sorte que vous pouvez envisager de faire la touche une partie de la carte du composant et de la gestion des clics dans les actions de hachage de votre composant. Si ce bouton est toujours partant pour accompagner la carte de composant, puis je le recommande certainement cette approche.
Vous pourriez avoir une propriété booléenne sur votre contrôleur comme
isCentered
, et lorsque le bouton est cliqué, il est défini à true. Dans votre partie, vous pouvez lier à celle du contrôleur de la propriété, et de réagir à chaque fois que des modifications de la propriété. C'est une liaison bidirectionnelle de sorte que vous pouvez également modifier vos liée localement à la propriété à false si l'utilisateur déplace la carte, par exemple.Contrôleur:
Composant:
Jeremy Green solution peut fonctionner que si vous mélangez dans la Braise.Evented mixin dans le contrôleur (ce qui ajoute de la pub/sub
trigger
eton
méthodes)Vous pouvez utiliser
on
d'avoir de vos composants à l'écoute pour un événement à partir de la manette, puis vous pouvez utilisertrigger
dans le contrôleur d'émettre un événement.Dans votre composant que vous pourriez avoir quelque chose comme ceci:
Et dans votre contrôleur, vous pourriez avoir :
Ember.Evented
mixin, comme suit:App.someController = Ember.Controller.extend(Ember.Evented, { ... });
, alors vous pouvez vous abonner à des événements et de déclencher des événements en utilisant les méthodes de laEmber.Evented
mixin.this
est lié à la bonne chose quand lerecenter
fonction est appelée. api.jquery.com/jQuery.proxythis.get('targetObject')
au lieu dethis.get('controller')
Lier une propriété d'un composant à la propriété de contrôleur dans le modèle:
Alors observer les propriétés de composant en composant:
Maintenant, à chaque fois
controllerProperty
est changé dans le contrôleur,onChange
dans le composant sera appelé.De cette réponse, deuxième alinéa.
Je pense que c'est OK d'avoir une référence dans votre contrôleur à votre composant. Il est vrai que votre composant encapsule son propre comportement, mais les méthodes publiques comme
reload
etc. sont parfaitement bien.Ma solution pour cela est de passer le courant
controller
de la composante et de définir une propriété sur le contrôleur au sein de la composante.Exemple
modèle.hbs:
{{#component delegate=controller property="refComponent"}}
component.js:
Maintenant dans votre contrôleur, vous pouvez simplement obtenir une référence à votre composant avec
this.get("refComponent")
.Steffen
À l'intérieur de vos composants à l'appel:
Voir: http://emberjs.com/api/classes/Ember.Component.html#property_targetObject