Próbuję użyć Bootstrap Popover z EmberJS, tak aby zawartość popover będzie szablonem ember/handlebars (z wiązaniem itp.). Jak to zrobić? (Ember 1.0.0-RC2)Popovers z Bootstrap z szablonem ember.js
Odpowiedz
Oto przykład działa na popover Ember bootstrap (patrz http://jsfiddle.net/72fSd/):
App.Popover = Ember.View.extend({
parentSelector: '',
contentSelector: '',
didInsertElement: function() {
var self = this;
$(self.parentSelector).popover({
html: true,
content: function() {
var $content = $(self.contentSelector);
return $content.html();
}
});
}
instancję widok:
{{view App.Popover templateName="my-popover-content" parentSelector=".popoverButton" contentSelector="#popovercontent"}}
Tutaj parentSelector może np. wybierz przycisk. Upewnij się, że masz kontener div z identyfikatorem #popovercontent w szablonie treści my-popover, aby zadziałał komponent contentSelector. Oczywiście musisz załadować szablon przed inicjalizacją widoku.
Wiązanie dwustronne powinno działać z tym rozwiązaniem.
ex jeśli chcesz popup obraz zrobić coś takiego w wyświetlać
imgTag: '<img src="smiley.gif" alt="Smiley face" height="42" width="42">',
didInsertElement: function() {
var self = this;
Ember.run.schedule('actions', this, function() {
self.$().popover({
title: 'Smile!!!',
html: true,
content: self.get('imgTag'),
placement: 'bottom',
trigger: 'hover'
});
});
},
willDestroyElement: function() {
this.$().popover('destroy');
}
Dzięki temu mogę używać statycznego kodu HTML w treści, w jaki sposób mogę renderować szablon? –
treść: Ember.Handlebars.compile ("moja kierownica {{handlebarProperty}}") – pjlammertyn
lub treści: '
', a następnie w kodzie stworzyć swój pogląd: var popupContentView = APP.PopUpContentView.create ({ kontroler: popupContentController }); i dołącz ją do zawartości div popupContentView.appendTo ($ ('# myPopupContentId')); – pjlammertynWpadłem też na ten problem i miałem ten sam problem, o którym wspomniał Robert, gdzie akceptowalne rozwiązanie po prostu nie pasuje do bardziej skomplikowanych scenariuszy.
Wpadłem na bardzo elegancką poprawkę, ale nie jestem pewien, czy jest ona przyjazna w przyszłości. Biorę wykorzystać renderToBuffer funkcji - patrz poniżej:
//make your popover view to be created later
App.PopoverView = Ember.View.extend({
templateName : 'name-of-your-template-with-content'
});
//then you make your link that will trigger the popover
App.PopoverLinkView = Ember.View.extend({
tagName : 'a',
didInsertElement : function(){
var that = this;
this.$().popover({
'html' : true,
'content' : function(el){
var detailView = App.PopoverView.create();
var html = detailView.renderToBuffer().buffer;
return html;
}
});
}
});
Zaletą jest to, że można przekazać w modelu i dokonać rzeczy dynamiczne. Nie testowałem tego dokładnie, ale chciałem to zrobić, aby potencjalnie pomóc innym.
Wziąłem odpowiedź Roberta powyżej nieco dalej. Stworzyłem komponent, a także po prostu używam elementu jQuery dla treści zamiast wywoływania .html(). (To łagodzi problem konieczności zduplikowane identyfikatory na stronie.)
App.CustomPopoverComponent = Ember.Component.extend({
tagName: 'button',
classNames: 'btn btn-default',
type: 'button',
popoverContentSelector: '',
didInsertElement: function() {
var component = this,
contents = $(component.get('popoverContentSelector'));
component.$().popover({
placement: 'bottom',
html: true,
content: contents
}).on('show.bs.popover', function() {
contents.removeClass('hide');
});
},
willDestroyElement: function() {
this.$().popover('destroy');
}
});
użyłem klasy Bootstrap za „hide”, aby ukryć zawartość początkowo. Następnie usunąłem klasę "ukryj" po raz pierwszy do pokazu. Od tego momentu wszystko działa zgodnie z oczekiwaniami.
To jak używać komponentu w szablonie kierownicy:
{{#custom-popover popoverContentSelector='.popoverContents'}}
Popover Button
{{/custom-popover}}
Wziąłem odpowiedź Terry'ego nieco dalej i myśleć mam wymyślić proste, ogólne rozwiązanie tego problemu.
stworzyłem składnik bootstrap-popover tak:
App.BootstrapPopoverComponent = Ember.Component.extend({
tagName: 'div', //whatever default you want... div is default anyway here
classNames: '', //whatever default you want
placement: 'bottom', //whatever default you want
didInsertElement: function() {
var component = this,
contents = this.$('.popoverJs');
component.$().popover({
animation: false,
placement: component.get('placement'),
html: true,
content: contents
}).on('show.bs.popover', function() {
contents.removeClass('hide');
});
},
willDestroyElement: function() {
this.$().popover('destroy');
}
});
Oto związane szablon:
<script type="text/x-handlebars" id="components/bootstrap-popover">
{{title}}
<div class="popoverJs hide">
{{yield}}
</div>
</script>
Uwaga korzystanie z „ukryć” klasy ukryć uzyskane zawartość początkowo. Ta klasa to po prostu "display: none". Bez tego rzeczy nie będą działać tak, jak byś miał nadzieję.
Kiedy już, że można po prostu zrobić coś jak to zrobić, gdy chcesz popover:
{{#bootstrap-popover title="My Fancy Popover" tagName="button"}}
<ul>
<li>my</li>
<li>awesome</li>
<li>popover</li>
<li>contents</li>
<li>example</li>
</ul>
{{/bootstrap-popover}}
Zawartość powinien móc być cokolwiek chcesz - dowolną HTML, renderowania komponentu lub częściowe itp. Oczywiście, możesz podać inne nazwy tagów, nazwy klas, tytuł, miejsce docelowe itd. według własnego uznania.
Mam nadzieję, że to rozwiązanie pomoże.
To jest naprawdę sprytne. Dzięki! Chociaż jest to z pewnością bardziej skomplikowane niż przyjęta odpowiedź, myślę, że jego ponowne wykorzystanie sprawia, że jest to najlepsze. – xcskier56
Istnieje pewien problem z tym podejściem, w pewnych nieczęstych okolicznościach: jeśli szablon renderujący treść popover zawiera elementy z '{{action ...}}' pomocnikami, są one tracone, ponieważ to co robi komponent to klonowanie popover html z elementów renderowanych przez szablon, do nowych elementów, które będą faktycznie renderowane. Procedury obsługi akcji są tracone w tym procesie. Wciąż próbuję wymyślić, jak przezwyciężyć to. Jednak nic złego w odpowiedzi per se. Wiem, że mój przypadek użycia jest bardzo rzadki. – Ernesto
możesz umieścić to w jsfiddle? – Ben
na pewno, skrzypce jest tutaj: http://jsfiddle.net/72fSd/ – Robert
idealne. Zwycięski zwycięzca obiad z kurczaka. – Ben