Recherche…
Remarques
Les exemples de Blaze ci-dessus sont hautement compatibles avec la bibliothèque http://bootsnipp.com/ , qui fournit uniquement le HTML et le CSS pour les composants et laisse le javascript au développeur. Cela permet aux composants de partager les mêmes méthodes de tri, de filtrage, de requête et de curseur sous-jacentes.
Menu déroulant
L'exemple suivant crée un menu déroulant Bootstrap, utilisant uniquement Blaze et aucune JQuery.
Modèle d'objet de document
<nav class="nav navbar-nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{getSelectedValue}} <span class="glyphicon glyphicon-user pull-right"></span></a>
<ul class="fullwidth dropdown-menu">
<li id="firstOption" class="fullwidth"><a href="#">15 Minutes <span class="glyphicon glyphicon-cog pull-right"></span></a></li>
<li class="divider"></li>
<li id="secondOption"><a href="#">30 Minutes <span class="glyphicon glyphicon-stats pull-right"></span></a></li>
<li class="divider"></li>
<li id="thirdOption"><a href="#">1 Hour <span class="badge pull-right"> 42 </span></a></li>
<li class="divider"></li>
<li id="fourthOption"><a href="#">4 Hour <span class="glyphicon glyphicon-heart pull-right"></span></a></li>
<li class="divider"></li>
<li id="fifthOption"><a href="#">8 Hours <span class="glyphicon glyphicon-log-out pull-right"></span></a></li>
</ul>
</li>
</nav>
Javascript
Template.examplePage.helpers({
getSelectedValue:function(){
return Session.get('selectedValue');
}
});
Template.dropDownWidgetName.events({
'click #firstOption':function(){
Session.set('selectedValue', 1);
},
'click #secondOption':function(){
Session.set('selectedValue', "blue");
},
'click #thirdOption':function(){
Session.set('selectedValue', $('#thirdOption').innerText);
},
'click #fourthOption':function(){
Session.set('selectedValue', Session.get('otherValue'));
},
'click #fifthOption':function(){
Session.set('selectedValue', Posts.findOne(Session.get('selectedPostId')).title);
},
});
Navbars
Une tâche très courante consiste à créer des barres de navigation réactives et à créer des barres d'action / pied de page qui ont des contrôles différents en fonction de la page sur laquelle se trouve un utilisateur ou du rôle auquel un utilisateur appartient. Revenons sur comment faire ces contrôles.
Routeur
Router.configure({
layoutTemplate: 'appLayout',
});
Router.route('checklistPage', {
path: '/lists/:_id',
onBeforeAction: function() {
Session.set('selectedListId', this.params._id);
this.next();
},
yieldTemplates: {
'navbarFooter': {
to: 'footer'
}
}
});
Créer un modèle de barre de navigation
<template name="navbarFooter">
<nav id="navbarFooterNav" class="navbar navbar-default navbar-fixed-bottom" role="navigation">
<ul class="nav navbar-nav">
<li><a id="addPostLink"><u>A</u>dd Post</a></li>
<li><a id="editPostLink"><u>E</u>dit Post</a></li>
<li><a id="deletePostLink"><u>D</u>elete Post</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a id="helpLink"><u>H</u>elp</a></li>
</ul>
</nav>
</template>
Définir les rendements dans la mise en page
<template name="appLayout">
<div id="appLayout">
<header id="navbarHeader">
{{> yield 'header'}}
</header>
<div id="mainPanel">
{{> yield}}
</div>
<footer id="navbarFooter" class="{{getTheme}}"">
{{> yield 'footerActionElements' }}
</footer>
</div>
</template>
Modals
Cette approche est une approche pure-blaze pour basculer des éléments d'interface utilisateur dans et hors de l'existence. Considérez ceci comme un remplacement des dialogues modaux. En fait, il existe plusieurs manières d'implémenter des boîtes de dialogue modales en utilisant cette méthode (ajoutez simplement des masques et des animations d'arrière-plan).
Modèle d'objet de document
<template name="topicsPage">
<div id="topicsPage" class="container">
<div class="panel">
<div class="panel-heading">
Nifty Panel
</div>
<!-- .... -->
<div class="panel-footer">
<!-- step 1. we click on the button object -->
<div id="createTopicButton" class="btn {{ getPreferredButtonTheme }}">Create Topic</div>
</div>
</div>
<!-- step 5 - the handlebars gets activated by the javascript controller -->
<!-- and toggle the creation of new objects in our model -->
{{#if creatingNewTopic }}
<div>
<label for="topicTextInput"></label>
<input id="topicTextInput" value="enter some text..."></input>
<button class="btn btn-warning">Cancel</button>
<button class="btn btn-success">OK</button>
</div>
{{/if}}
</div>
</template>
Javascript
// step 2 - the button object triggers an event in the controller
// which toggles our reactive session variable
Template.topicsPage.events({
'click #createTopicButton':function(){
if(Session.get('is_creating_new topic'){
Session.set('is_creating_new_topic', false);
}else{
Session.set('is_creating_new_topic', true);
}
}
});
// step 0 - the reactive session variable is set false
Session.setDefault('is_creating_new_topic', false);
// step 4 - the reactive session variable invalidates
// causing the creatNewTopic function to be rerun
Template.topicsPage.creatingNewTopic = function(){
if(Session.get('is_creating_new_topic')){
return true;
}else{
return false;
}
}
Le marquage
La couche de base de données Tout d'abord, nous voulons configurer le protocole de distribution de données pour nous assurer que nous pouvons conserver les données dans la base de données et les transmettre au client. Trois fichiers doivent être créés ... un sur le serveur, un sur le client et un partagé entre les deux.
// client/subscriptions.js
Meteor.subscribe('posts');
//lib/model.js
Posts = new Meteor.Collection("posts");
Posts.allow({
insert: function(){
return true;
},
update: function () {
return true;
},
remove: function(){
return true;
}
});
// server.publications.js
Meteor.publish('posts', function () {
return Posts.find();
});
Cet exemple suppose le schéma de document suivant pour le modèle de marquage:
{
_id: "3xHCsDexdPHN6vt7P",
title: "Sample Title",
text: "Lorem ipsum, solar et...",
tags: ["foo", "bar", "zkrk", "squee"]
}
Modèle d'objet de document
Deuxièmement, nous voulons créer notre modèle d’objet dans la couche application. Voici comment vous utiliseriez un panneau Bootstrap pour rendre une publication avec titre, texte et balises. Notez que selectedPost
, tagObjects
et tag
sont tous des fonctions d'assistance du modèle blogPost. title
et le text
sont des champs de notre document.
<template name="blogPost">
{{#with selectedPost }}
<div class="blogPost panel panel-default">
<div class="panel-heading">
{{ title }}
</div>
{{ text }}
<div class="panel-footer">
<ul class="horizontal-tags">
{{#each tagObjects }}
<li class="tag removable_tag">
<div class="name">{{tag}}<i class="fa fa-times"></i></div>
</li>
{{/each}}
<li class="tag edittag">
<input type="text" id="edittag-input" value="" /><i class="fa fa-plus"></i>
</li>
</ul>
</div>
</div>
{{/with}}
</template>
Javascript
Ensuite, nous voulons configurer certains contrôleurs pour renvoyer des données, implémenter des entrées de données, etc.
// you will need to set the selectedPostId session variable
// somewhere else in your application
Template.blogPost.selectedPost = function(){
return Posts.findOne({_id: Session.get('selectedPostId')});
}
// next, we use the _.map() function to read the array from our record
// and convert it into an array of objects that Handlebars/Spacebars can parse
Template.blogPost.tagObjects = function () {
var post_id = this._id;
return _.map(this.tags || [], function (tag) {
return {post_id: post_id, tag: tag};
});
};
// then we wire up click events
Template.blogPost.events({
'click .fa-plus': function (evt, tmpl) {
Posts.update(this._id, {$addToSet: {tags: value}});
},
'click .fa-times': function (evt) {
Posts.update({_id: this._id}, {$pull: {tags: this.tag}});
}
});
Coiffant
Enfin, nous souhaitons définir des vues différentes pour les téléphones, les tablettes et les ordinateurs de bureau. et certains styles d'interface utilisateur de base en fonction de la saisie de l'utilisateur. Cet exemple utilise le précompilateur Less, bien que la syntaxe soit à peu près la même pour Sass et Stylus.
// default desktop view
.fa-plus:hover{
cursor: pointer;
}
.fa-times:hover{
cursor: pointer;
}
// landscape orientation view for tablets
@media only screen and (min-width: 768px) {
.blogPost{
padding: 20px;
}
}
// portrait orientation view for tablets
@media only screen and (max-width: 768px) {
.blogPost{
padding: 0px;
border: 0px;
}
}
// phone view
@media only screen and (max-width: 480px) {
blogPost{
.panel-footer{
display: none;
}
}
}
Alertes et erreurs
Les alertes et les erreurs sont presque les plus simples de tous les modèles de composants Meteor. En fait, ils sont si simples qu’ils sont à peine enregistrés en tant que modèles d’eux-mêmes. Au lieu d'ajouter des modules ou des modèles FlashAlert, il vous suffit de donner un style approprié au modèle de guidon, d'ajouter une aide et de le connecter à une variable de session réactive.
Conditions préalables
Le code suivant nécessite respectivement le précompilateur LESS et Bootstrap-3. Vous devrez exécuter les commandes suivantes à l'invite de commande pour les faire fonctionner.
meteor add less
meteor add ian:bootstrap-3
Modèle d'objet de document: Définir un objet d'alerte Commencez par ajouter des éléments à votre modèle d'objet de document. Dans ce cas, nous voulons créer un élément div pour notre alerte, qui est connecté à deux aides au guidon.
<template name="postsPage">
<div id="postsPage" class="page">
<div id="postsPageAlert" class="{{alertColor}}">{{alertMessage}}</div>
<div class="postsList">
<!-- other code you can ignore in this example -->
</div>
<div id="triggerAlertButton" class="btn btn-default">
</div>
</template>
Javascript: Définir les aides de modèle Ensuite, nous voulons câbler certains contrôleurs qui rempliront le modèle d'objet avec des données. Nous le faisons avec deux variables de session réactives et deux aides au guidon.
Session.setDefault('alertLevel', false);
Session.setDefault('alertMessage', "");
Template.postsPage.alertColor = function(){
if(Session.get('alertLevel') == "Success"){
return "alert alert-success";
}else if(Session.get('alertLevel') == "Info"){
return "alert alert-info";
}else if(Session.get('alertLevel') == "Warning"){
return "alert alert-warning";
}else if(Session.get('alertLevel') == "Danger"){
return "alert alert-danger";
}else{
return "alert alert-hidden"
}
}
Template.postsPage.alertMessage = function(){
return Session.get('alertMessage');
}
Styling: Définir la visibilité du DOM Ensuite, nous voulons revenir à notre CSS et définir deux vues de l'élément postsPage. Dans la première vue, nous affichons tout le contenu de notre modèle d'objet. Dans la seconde vue, seule une partie du contenu de notre modèle d’objet est affichée.
#postsPage{
.alert{
display: block;
}
.alert-hidden{
display: none;
}
}
Javascript: déclencher l'alerte
Enfin, nous revenons à nos contrôleurs, et nous définissons un contrôleur d’événements, qui déclenchera notre alerte lorsque vous cliquerez dessus.
Template.postsPage.events({
'click #triggerAlertButton':function(){
Session.set('alertLevel', 'Success');
Session.set('alertMessage', 'You successfully read this important alert message.');
}
});
Et c'est tout ce qu'il y a à faire! Super simple, non? Vous pouvez maintenant définir les variables de session alertLevel
et alertMessage
n'importe où dans votre base de code et votre application affichera de manière réactive les alertes et les messages d'erreur! :)
Flux de travail par onglets
Modèle d'objet de document
Commencez par créer vos onglets et volets dans votre modèle d'objet ...
<template name="samplePage">
<div id="samplePage" class="page">
<ul class="nav nav-tabs">
<li id="firstPanelTab"><a href="#firstPanel">First</a></li>
<li id="secondPanelTab"><a href="#secondPanel">Second</a></li>
</ul>
<div id="firstPanel" class="{{firstPanelVisibility}}">
{{> firstPanel }}
</div>
<div id="secondPanel" class="{{secondPanelVisibility}}">
{{> secondPanel }}
</div>
</div>
</template>
Javascript
// this variable controls which tab is displayed and associated application state
Session.setDefault('selectedPanel', 1);
Template.name.helpers({
firstPanelVisibility: function (){
if(Session.get('selectedPanel') === 1){
return "visible";
}else{
return "hidden";
}
},
secondPanelVisibility: function (){
if(Session.get('selectedPanel') === 2){
return "visible";
}else{
return "hidden";
}
},
thirdPanelVisibility: function (){
if(Session.get('selectedPanel') === 3){
return "visible";
}else{
return "hidden";
}
},
firstPanelActive: function (){
if(Session.get('selectedPanel') === 1){
return "active panel-tab";
}else{
return "panel-tab";
}
},
secondPanelActive: function (){
if(Session.get('selectedPanel') === 2){
return "active panel-tab";
}else{
return "panel-tab";
}
},
thirdPanelActive: function (){
if(Session.get('selectedPanel') === 3){
return "active panel-tab";
}else{
return "panel-tab";
}
}
});
Coiffant
.visible {
display: block;
visibility: visible;
}
.hidden {
display: none;
visibility: hidden;
}
Onglet actif Pour plus d'effet, vous pouvez étendre ce modèle en injectant des classes pour indiquer l'onglet actif.
<li id="firstPanelTab" class="{{firstPanelActive}}"><a href="#firstPanel">First</a></li>
<li id="secondPanelTab" class="{{secondPanelActive}}"><a href="#secondPanel">Second</a></li>
Template.firstPanel.helpers({
firstPanelActive: function (){
if(Session.get('selectedPanel') === 1){
return "active";
}else{
return "";
}
},
secondPanelActive: function (){
if(Session.get('selectedPanel') === 2){
return "active";
}else{
return "";
}
},
});