Publié le 27 Janvier 2015

J'utilise ReactiveMongo pour me connecter à mongodb et j'ai un problème avec une commande update qui ne met pas à jour toutes les lignes.

En fait j'utilise le sélecteur suivant:

{ $and: [
   {"valid": true},
   {"countries":
      { $in: ["uk", "fr", "de"] }
   }
]}

Ce qui traduit en BSONDocument donne:

val countries = List("uk", "fr", "de")
val selector = BSONDocument(
   "$and" -> BSONArray(List(
      BSONDocument("valid" -> true),
      BSONDocument("countries" ->
         BSONDocument("$in" -> BSONArray(countries.map(BSONString)))
      )
   ))
)

Attention à bien transformer la List[String] en List[BSONString].

Dans mon cas c'était la raison pour laquelle mon sélecteur ne sélectionnait pas tous les documents attendus.

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala, #mongo

Repost 0

Publié le 27 Janvier 2015

La commande sbt test exécute tous les tests d'un projet.

Il est bien sûr possible de n'exécuter qu'un seul test (ou tester une seule class ou package) avec l'option test-only.

Le truc est qu'il faut placer les guillemets au bon endroit sinon ça ne marche pas.

La syntaxe correcte est la suivante pour exécuter tous les tests présents dans MaClassSpec:

sbt "test-only *MaClassSpec"

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Repost 0

Publié le 25 Janvier 2015

Bower est un outil permettant de faciliter la gestion des dépendances dans une application web.

La façon classique de déclarer une dépendance dans le fichier bower.json se fait de la manière suivante:

"angular": "1.3.1"

Grâce à cette déclaration bower va automatiquement télécharger la bonne version depuis de repo git d'angular et l'inclure dans notre webapp.

Comment?

Et bien bower utilise un index public pour trouver le repo git correspondant à angular (ex: git://github.com/angular).

Ensuite bower cherche dans le repo git un tag correspondant à la version spécifiée puis télécharge le code source. Cool, non?

Et bien ce n'est pas tout. Bower permet aussi de gérer vos dépendances internes. Imaginons que vous ayez développé un composant angular que vous souhaitez intégrer dans plusieurs projets en tant que dépendance. Et bien au lieu d'indiquer un numéro de version directement on peut spécifié l'url d'un repo git.

Par exemple:

"mon-composant": "git://mon.repo:moi/mon/composant"

On peut ici utiliser soit une URL git (comme ci-dessus), soit https (https://mon.repo/moi/mon/composant) ou encore ssh (git@mon.repo:moi/mon/composant)

Et en plus on peut même gérer les versions en ajoutant un #<version> à la fin de l'URL.

Au lieu de <version> on peut indiquer tout élément identifiant un commit. C'est à dire qu'on peut indiquer un numéro de commit, un tag ou même une branche git.

Merci bower!

Voir les commentaires

Rédigé par Bliz

Publié dans #Javascript

Repost 0

Publié le 19 Janvier 2015

Si vous avez remarqué angular fournit une directive ng-click qui permet de configurer une action à exécuter lors d'un click utilisateur sur un élément.

En revanche il n'y a pas de directive ng-clickout qui permettrait de configurer une action lors d'un click utilisateur hors de cet élément.

Il y a ng-blur qui correspond à ce cas d'utilisation mais il ne s'applique pas sur les div.

 

Heureusement la création d'une directive ng-clickout s'avère assez simple si on utilise la function link et un peu de jqlite.

angular.module('monApplication')
   .directive('ngClickout', ['$document', function ($document) {
      return {
         restrict: 'A', // ng-clickout n'est disponible qu'en tant qu'attribute
         link: function (scope, element, attr) {
            element.bind('click', function (event) {
               event.stopPropagation(); // stop propagation pour ne pas rentrer dans le $document.click event
            });
           
            $document.bind('click', function () {
               // on a un click hors de l'élément donc on exécute la fonction définie dans l'attribut ng-clickout
               scope.$apply(attr.ngClickout);
            });
         }
      };
}]);

 

L'astuce consiste à utiliser event.stopPropagation() sur l'élément en question. Cela permet d'être sûr que le gestionnaire de click sur le document reçoit tous les clics sauf ceux sur l'élément où est appliqué ng-clickout.

 

La seconde astuce consiste à utiliser scope.$apply qui permet d'exécuter la fonction passée dans ng-clickout et de mettre à jour le scope angular et donc de mettre à jour tous les bindings angular.

Voir les commentaires

Rédigé par Bliz

Publié dans #angular

Repost 0