Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1408 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8  9  10  11
Auteur Sujet :

Ember.js - Framework JS - Ember Octane disponible !

n°2241413
youmoussa
Ecrou-vis
Posté le 28-10-2014 à 06:14:19  profilanswer
 

Reprise du message précédent :
Il suffit de lire les tests pour savoir comment utiliser les events :o
 
https://github.com/emberjs/data/blo [...] est.js#L21


---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
mood
Publicité
Posté le 28-10-2014 à 06:14:19  profilanswer
 

n°2241414
nraynaud
lol
Posté le 28-10-2014 à 06:16:36  profilanswer
 

youmoussa a écrit :


non, car ca tire avantage du cache des CPs.
 
Tu fais rien, et tu demandes la CP: elle n'est pas en cache, donc la fonction est appelée, tu tombes dans la partie getter.
La valeur te plait, tu tapes dans le champs, avec le binding, ca va faire un `set('speed', laNouvelleValeur)`. Tu tombes dans la partie setter qui ne fait rien de spéciale, et c'est `laNouvelleValeur` qui est mise en cache
Tu redemandes `get('speed')`, ca te renvoie direct la valeur du cache.
Tu changes `toolDiameter`, ca invalide le cache, sans recalculer la valeur. C'est uniquement lors du prochain accès que ce sera calculé.
Dans ce cas précis, c'est quand la vue se remet à jour. Et dans ce cas, la fonction associée est executée et renvoie la valeur du getter.


et à la sérialisation (pour envoyer au serveur, disons), il va bien lire le cache ? et à la dé-sérialisation il va bien tenir compte de la valeur de l'utilisateur et pas celle calculée ?
 

youmoussa a écrit :


`on('didCreate')` aurait du marcher AMHA.


'tain en fait j'ai d'autres endroits où ça marche. Je dois avoir un bug secondaire. En plus l'explorateur Ember est dé-synchronlsé de ma vue, y'a un autre problème :fou:
 
'tain la nuit entière à essayer de passer 3 objets vers ember-data.


---------------
trainoo.com, c'est fini
n°2241415
youmoussa
Ecrou-vis
Posté le 28-10-2014 à 06:23:54  profilanswer
 

nraynaud a écrit :


et à la sérialisation (pour envoyer au serveur, disons), il va bien lire le cache ? et à la dé-sérialisation il va bien tenir compte de la valeur de l'utilisateur et pas celle calculée ?
 


 
Les CPs ne sont pas sérialisées par défaut, seuls les propriétés utilisant `DS.attr` le sont.
 
Tu peux écrire un sérialiseur pour ce modèle si tu veux obtenir ce genre de comportement.
 

nraynaud a écrit :


'tain en fait j'ai d'autres endroits où ça marche. Je dois avoir un bug secondaire. En plus l'explorateur Ember est dé-synchronlsé de ma vue, y'a un autre problème :fou:
 
'tain la nuit entière à essayer de passer 3 objets vers ember-data.


 
C'est dispo dans une branche ce code ?


---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241416
youmoussa
Ecrou-vis
Posté le 28-10-2014 à 06:37:39  profilanswer
 

J'ai fait un JsBin pour démontrer en quoi il est en général plus intéressant d'utiliser une CP plutôt qu'un observer
 
http://emberjs.jsbin.com/gibifatika/1/edit
 
Au démarrage, l'observer et la CP ont été éxecuté le même nombre de fois.
 
Mais quand on utilise le bouton qui modifie plusieurs fois la propriété dont dépend l'observer et la CP, on voit que la CP est plus économique.


---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241417
nraynaud
lol
Posté le 28-10-2014 à 06:41:57  profilanswer
 

Je pense que je vais rester avec mon champ et ses listeners, parce que je vois pas l'apport des computed properties, par contre je vois ce que j'y perds en clarté et en sérialisation par défaut.
 
 
c'est sur ma working copy pour l'instant.
 
Et puis là c'est vraiment le merdier, il faudrait s'assoir côte à côte parce qu'il y a 30000 trucs qui marchent pas, donc avoir le code sans savoir sur quoi je focus servirait pas à grand'chose.  
 
Les fixtures semblent avoir un problème ([:pingouino], je sais même pas comment c'est possible qu'un truc aussi simple ne marche pas, j'ai dû faire une toute petite erreur et y'a un nom qui matche pas un truc et du coup le truc est pas reconnu mais fiat pas d'erreur), les events j'arrive pas à les faire marcher (pareil pas d'erreur) et puis ça a niqué les routes, mais bon, c'est peut-être évident j'ai pas encore regardé, vu que sans modèle c'est pas la peine de se faire chier à regarder les mécanismes d'interaction.


---------------
trainoo.com, c'est fini
n°2241418
youmoussa
Ecrou-vis
Posté le 28-10-2014 à 06:56:07  profilanswer
 

Ah ben tu peux venir sur SF. On ira manger une salade de kale en hors d'oeuvre de notre repas gluten free :o

 

Je répète, ca marche pas très bien le FixtureAdapter.


Message édité par youmoussa le 28-10-2014 à 06:57:56

---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241419
youmoussa
Ecrou-vis
Posté le 28-10-2014 à 06:58:48  profilanswer
 

Tu dois voir des erreurs dans l'onglet Promise de l'inspecteur, j'ose espérer :/
 
Les promises, c'est un peu la merde pour ça.


---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241420
youmoussa
Ecrou-vis
Posté le 28-10-2014 à 07:01:04  profilanswer
 

Je t'invite à implémenter un global error handler aussi

 

http://emberjs.com/guides/understa [...] production

 

Bon, dodo pour moi :o


Message édité par youmoussa le 28-10-2014 à 07:01:19

---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241422
nraynaud
lol
Posté le 28-10-2014 à 07:08:56  profilanswer
 

Code :
  1. Visucam.Shape.reopenClass({
  2.            FIXTURES: [
  3.                {id: 1, definition: wabble.getEccentricShape()}
  4.            ]
  5.        });
  6.        Visucam.Operation.reopenClass({
  7.            FIXTURES: [
  8.                {id: 1, name: 'Eccentric Hole', outline: 1, job: 1}
  9.            ]
  10.        });
  11.        Visucam.Job.reopenClass({
  12.            FIXTURES: [
  13.                {id: 1, toolDiameter: 2, operations: [1], shape: [1]}
  14.            ]
  15.        });
 

y'a un bug évident là ?

 

dans l'inspecteur ember il voit 1 job, 0 shape, 0 operation.
quand je vais explorer le job, dans son hasMany "operations" y'a une opération dedans mais qui possède le nom par défaut et non les paramètres de la fixture (genre il a pas accroché les id). Et son hasMany "shapes" a une shape aussi, et vide aussi.
l'opération fantôme et la shape fantôme ont un ID de "1".

 

quand je modifie les IDs dans la fixture du job genre 'operations: [10]', l'opération fantôme a bien l'ID demandé, mais elle a pas les paramètres précisés dans sa fixture.

 

une petite exploration du job dans l'inspecteur:

>$E.get('operations').objectAt(0).get('name')
<"New Operation"
>$E.get('operations').objectAt(0).get('id')
<"1"
>$E.get('shapes').objectAt(0).get('id')
<"1"
>$E.get('shapes').objectAt(0).get('definition')
<undefined
>$E.get('toolDiameter')
<2

 

(le tool diameter est bien celui de la fixture, donc la seule fixture qui marche c'est celle du job)

 


Code :
  1. var attr = DS.attr;
  2.  
  3.    var Shape = DS.Model.extend({
  4.        definition: attr('string')
  5.    });
  6.  
  7.    var Operation2 = DS.Model.extend({
  8.        name: attr('string', {defaultValue: 'New Operation'}),
  9.        type: attr('string', {defaultValue: 'SimpleEngravingOperation'}),
  10.        outline: DS.belongsTo('shape'),
  11.        job: DS.belongsTo('job'),
  12.        installObservers: function () {
  13.            var properties = Operations[this.get('type')].properties;
  14.            var _this = this;
  15.            Object.keys(properties).forEach(function (key) {
  16.                _this.addObserver(key, _this, _this.computeToolpath)
  17.            });
  18.        }.observes('type').on('init'),
  19.        uninstallObservers: function () {
  20.            var properties = Operations[this.get('type')].properties;
  21.            var _this = this;
  22.            Object.keys(properties).forEach(function (key) {
  23.                _this.removeObserver(key, _this, _this.computeToolpath)
  24.            });
  25.        }.observesBefore('type'),
  26.        computeToolpath: function () {
  27.            Operations[this.get('type')]['computeToolpath'](this);
  28.        }.observes('type', 'job.toolDiameter', 'job.safetyZ').on('init')
  29.    });
  30.  
  31.    var Job2 = DS.Model.extend({
  32.        safetyZ: attr('number', {defaultValue: 5}),
  33.        toolDiameter: attr('number', {defaultValue: 3}),
  34.        toolFlutes: attr('number', {defaultValue: 2}),
  35.        surfaceSpeed: attr('number', {defaultValue: 200}),
  36.        chipLoad: attr('number', {defaultValue: 0.01}),
  37.        feedrate: attr('number', {defaultValue: 100}),
  38.        speed: attr('number', {defaultValue: 24000}),
  39.        startPoint: attr(null, {defaultValue: new util.Point(0, 0, 10)}),
  40.        operations: DS.hasMany('operation', {
  41.            inverse: 'job'
  42.        }),
  43.        shapes: DS.hasMany('shape'),
  44.        deleteOperation: function (operation) {
  45.            this.get('operations').removeObject(operation);
  46.        },
  47.        findOperation: function (id) {
  48.            return this.get('operations').findBy('id', Number(id));
  49.        },
  50.        transitionTravels: function () {
  51.            var operations = this.get('operations');
  52.            var travelBits = [];
  53.            var pathFragments = [];
  54.            var endPoint = null;
  55.            operations.forEach(function (operation) {
  56.                pathFragments.pushObjects(operation.get('toolpath'));
  57.            });
  58.            if (pathFragments.length) {
  59.                var prefix = new tp.GeneralPolylineToolpath();
  60.                prefix.pushPoint(this.get('startPoint'));
  61.                prefix.pushPoint(pathFragments[0].getStartPoint());
  62.                travelBits.push(prefix);
  63.                for (var i = 0; i < pathFragments.length; i++) {
  64.                    endPoint = pathFragments[i].getStopPoint();
  65.                    var travel = new tp.GeneralPolylineToolpath();
  66.                    travel.pushPointXYZ(endPoint.x, endPoint.y, endPoint.z);
  67.                    travel.pushPointXYZ(endPoint.x, endPoint.y, this.get('safetyZ'));
  68.                    if (i + 1 < pathFragments.length) {
  69.                        var destinationPoint = pathFragments[i + 1].getStartPoint();
  70.                        travel.pushPointXYZ(destinationPoint.x, destinationPoint.y, this.get('safetyZ'));
  71.                    }
  72.                    travelBits.push(travel);
  73.                }
  74.                var suffix = new tp.GeneralPolylineToolpath();
  75.                suffix.pushPoint(travelBits[travelBits.length - 1].getStopPoint());
  76.                suffix.pushPoint(this.get('startPoint'));
  77.                travelBits.push(suffix);
  78.            }
  79.            return travelBits;
  80.        }.property('operations.@each.toolpath.@each'),
  81.        createOperation: function (params) {
  82.            var operation = this.store.createRecord('operation', params);
  83.            operation.set('job', this);
  84.            this.get('operations').pushObject(operation);
  85.            return  operation;
  86.        },
  87.        createShape: function (def) {
  88.            var shape = this.store.createRecord('shape', {definition: def});
  89.            this.get('shapes').pushObject(shape);
  90.            return shape;
  91.        },
  92.        didCreate: function () {
  93.            this.updateSpeed();
  94.            console.log('didCreate')
  95.        },
  96.        updateSpeed: function () {
  97.            var toolDiameter = this.get('toolDiameter');
  98.            var surfaceSpeed = this.get('surfaceSpeed');
  99.            this.set('speed', Math.round(surfaceSpeed * 1000 / Math.PI / toolDiameter));
  100.        }.observes('surfaceSpeed', 'toolDiameter'),
  101.        updateFeedrate: function () {
  102.            var speed = this.get('speed');
  103.            var chipLoad = this.get('chipLoad');
  104.            var toolFlutes = this.get('toolFlutes');
  105.            this.set('feedrate', Math.round(speed * chipLoad * toolFlutes));
  106.        }.observes('toolFlutes', 'chipLoad', 'speed'),
  107.        getJson: function () {
  108.            var test = $.extend({}, this);
  109.            return JSON.stringify(test, function (key, value) {
  110.                if (['concatenatedProperties', 'isDestroyed', 'isDestroying'].indexOf(key) != -1)
  111.                    return undefined;
  112.                return value;
  113.            });
  114.        },
  115.        computeSimulableToolpath: function (travelFeedrate) {
  116.            var operations = this.get('operations');
  117.            var feedrate = this.get('feedrate');
  118.            var travelBits = [];
  119.            var pathFragments = [];
  120.            var endPoint = null;
  121.            operations.forEach(function (operation) {
  122.                pathFragments.pushObjects(operation.get('toolpath'));
  123.            });
  124.            var startPoint = this.get('startPoint');
  125.            var position = startPoint;
  126.  
  127.            function travelTo(point, speedTag) {
  128.                travelBits.push({
  129.                    type: 'line',
  130.                    from: position,
  131.                    to: point,
  132.                    speedTag: speedTag == null ? 'rapid' : speedTag,
  133.                    feedRate: speedTag == null ? travelFeedrate : feedrate});
  134.                position = point;
  135.            }
  136.  
  137.            var safetyZ = this.get('safetyZ');
  138.            // it could happen that the cycle be started from a position that is lower than the start point
  139.            // for example after doing the Z zeroing, the user might leave the tool just a few mm over the stock
  140.            // or in a hole, it would be unsafe to travel from there.
  141.            var safeStartPoint = new util.Point(startPoint.x, startPoint.y, Math.max(startPoint.z, safetyZ));
  142.            if (pathFragments.length) {
  143.                travelTo(safeStartPoint);
  144.                travelTo(pathFragments[0].getStartPoint());
  145.                for (var i = 0; i < pathFragments.length; i++) {
  146.                    var fragment = pathFragments[i];
  147.                    fragment.forEachPoint(function (x, y, z) {
  148.                        travelTo(new util.Point(x, y, z), 'normal');
  149.                    });
  150.                    endPoint = fragment.getStopPoint();
  151.                    travelTo(new util.Point(endPoint.x, endPoint.y, safetyZ));
  152.                    if (i + 1 < pathFragments.length) {
  153.                        var destinationPoint = pathFragments[i + 1].getStartPoint();
  154.                        travelTo(new util.Point(destinationPoint.x, destinationPoint.y, safetyZ));
  155.                    }
  156.                }
  157.                travelTo(safeStartPoint);
  158.            }
  159.            for (i = 0; i < travelBits.length - 1; i++) {
  160.                var previous = travelBits[i].to;
  161.                var next = travelBits[i + 1].from;
  162.                if (previous.sqDistance(next))
  163.                    console.error('continuity error', i, travelBits[i], travelBits[i + 1]);
  164.            }
  165.            return travelBits;
  166.        }
  167.    });


Message édité par nraynaud le 28-10-2014 à 07:09:41

---------------
trainoo.com, c'est fini
n°2241423
nraynaud
lol
Posté le 28-10-2014 à 07:10:12  profilanswer
 

(toutes les promises de l'inspecteur sont fulfilled)


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 28-10-2014 à 07:10:12  profilanswer
 

n°2241611
nraynaud
lol
Posté le 29-10-2014 à 09:15:31  profilanswer
 

bon, presque tout marche.
 
Est-ce qu'il y a moyen de faire chercher tout un sous-graphe à Ember data, sans promise au milieu et sans truc asynchrone, juste un putain de graphe complet, normal ?


---------------
trainoo.com, c'est fini
n°2241641
nraynaud
lol
Posté le 29-10-2014 à 12:05:19  profilanswer
 

https://github.com/emberjs/ember.js [...] on_view.js
'tain j'aurai besoin d'une classe qui contienne 90% du code de ce fichier, sans tout le merdier associé au DOM, c'est dommage pas l'avoir sorti.
 
un truc qui prend une classe en paramètre, fait create() pour les éléments qui rentrent, fait destroy() pour les éléments qui sortent et c'est tout.


---------------
trainoo.com, c'est fini
n°2241921
nraynaud
lol
Posté le 31-10-2014 à 22:30:41  profilanswer
 

j'y comprends rien aux embedded records.

 

J'ai un Job qui a une liste d'operations et une liste de shapes. Chaque operation a un pointeur vers une shape. Je veux embedder les operations et les shapes dans le Job (ma base est une base hiérarchique, du coup, c'est comme si job était un document, tous ses éléments sont sous son noeud).

 

J'ai fait ça:

Code :
  1. var Job = DS.Model.extend({
  2.             operations: DS.hasMany('operation', {inverse: 'job', embedded: true}),
  3.             shapes: DS.hasMany('shape', {embedded: true}),
  4. ...
  5. var operationDefinition = {
  6.             outline: DS.belongsTo('shape', {async: true}),
  7.             job: DS.belongsTo('job', {async: true}),
  8. ...


ça me donne ça:
http://i.imgur.com/pQrmS96.png

 

sauf qu'à la deserialisation, il arrive pas à se souvenir que les shapes sont pas dans une table à part, mais dans le job, et qu'il faut aller les chercher là-bas.

 

Y'a une technique pour lui dire ?


Message édité par nraynaud le 31-10-2014 à 22:31:46

---------------
trainoo.com, c'est fini
n°2241923
nraynaud
lol
Posté le 31-10-2014 à 22:49:10  profilanswer
 

truc de fou, en fait il dé-sérialize dans l'ordre dans lequel c'est défini dans la classe, du coup il faut trier soi-même dans l'ordre des dépendances. Là je les avais mise avec operations d'abord et shapes ensuite. Du coup il dé-sérialisait une opération et allait chercher le shape correspondant dans le store, ne trouvait rien et allait voir sur le serveur si y'avais pas une "table".


---------------
trainoo.com, c'est fini
n°2241934
nraynaud
lol
Posté le 01-11-2014 à 11:48:31  profilanswer
 

youmoussa a écrit :

Apparemment, il n'y a pas de doc là dessus effectivement, donc le code et les tests serviront de doc
 
https://github.com/emberjs/ember.js [...] ntainer.js
 
https://github.com/emberjs/ember.js [...] er_test.js
 
 
 
Se servir du store de manière globale, c'est pour des tests ou pour un but précis? Accéder n'importe quoi de n'importe où, ca va souvent rarement dans le sens d'une bonne modularisation et ca rend l'écriture de test pénible.


en fait c'est la pire réponse possible.
ça me dit pas où est enregistré le container, d'où il est visible et où je peux utiliser "needs" .
 
qu'un container est une hashmap, merci, j'ai assez joué avec. c'est les retarderies spécifiques à Ember qui m'intéressent.


---------------
trainoo.com, c'est fini
n°2241941
youmoussa
Ecrou-vis
Posté le 01-11-2014 à 14:56:20  profilanswer
 

nraynaud a écrit :


en fait c'est la pire réponse possible.
ça me dit pas où est enregistré le container, d'où il est visible et où je peux utiliser "needs" .
 
qu'un container est une hashmap, merci, j'ai assez joué avec. c'est les retarderies spécifiques à Ember qui m'intéressent.


 
Désolé si j'essaie de répondre en donnant de bonnes pratiques plutôt que de favoriser la bidouille :o
 
Ben "needs", c'est uniquement sur les contrôleurs.
 
Tu peux tricher et avoir accès au container via App.__container__, mais si le nom de la variable est un peu tordu, c'est justement pour montrer que ce n'est pas bon signe si tu l'utilises dans ton code.


---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241943
youmoussa
Ecrou-vis
Posté le 01-11-2014 à 15:02:17  profilanswer
 

nraynaud a écrit :

truc de fou, en fait il dé-sérialize dans l'ordre dans lequel c'est défini dans la classe, du coup il faut trier soi-même dans l'ordre des dépendances. Là je les avais mise avec operations d'abord et shapes ensuite. Du coup il dé-sérialisait une opération et allait chercher le shape correspondant dans le store, ne trouvait rien et allait voir sur le serveur si y'avais pas une "table".


 
Je pense qu'il y a un soucis dans ton code ou un bug dans ED, car ton idée initiale sur le fonctionnement me semble correcte.
 
Il n'y a aucune raison pour accéder au Shape a partir de l'opération pendant la deserialization. Tu as marqué cette relation asynchrone, donc ED ne devrait faire le lookup que lorsque tu fais un truc du genre "job.operations[0].shape" ( c'est un peu du pseudo code )


Message édité par youmoussa le 01-11-2014 à 15:02:54

---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241944
nraynaud
lol
Posté le 01-11-2014 à 15:02:19  profilanswer
 

youmoussa a écrit :


 
Désolé si j'essaie de répondre en donnant de bonnes pratiques plutôt que de favoriser la bidouille :o


ça fait 20 ans que je développe, j'ai une certaine idée des "bonnes pratiques" [:pignouino]
 
Et je crois pas que ré-implémenter les containers lourds en moins bien en fasse partie en fait [:pignouino]


---------------
trainoo.com, c'est fini
n°2241945
youmoussa
Ecrou-vis
Posté le 01-11-2014 à 15:03:22  profilanswer
 

nraynaud a écrit :


ça fait 20 ans que je développe, j'ai une certaine idée des "bonnes pratiques" [:pignouino]
 
Et je crois pas que ré-implémenter les containers lourds en moins bien en fasse partie en fait [:pignouino]


 
Je sais pas, je me contente de lire ton code :o
 
Tu peux faire une PR pour améliorer les choses sinon [:idee]

Message cité 1 fois
Message édité par youmoussa le 01-11-2014 à 15:04:07

---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241949
nraynaud
lol
Posté le 01-11-2014 à 15:47:49  profilanswer
 

youmoussa a écrit :


 
Je sais pas, je me contente de lire ton code :o
 
Tu peux faire une PR pour améliorer les choses sinon [:idee]


le code d'un proto d'apprentissage ? Intéressante idée.
 
J'y comprends rien au système de base, donc avant de faire une PR y'a des millénaires. J'essaye de soumettre des PR utiles.
Enfin surtout j'en ai plein le cul d'ember, je sais pas encore si je vais le virer, parce que je vois pas en quoi autre chose sera plus simple à apprendre, mais c'est vraiment le syndrome du beau logo et agressivité sur twitter et franchement rien de transcendant en-dessous. C'est du java swing inavigable et sans le génie des mecs de codehaus ou de jgoodies.
Plus j'en apprends et moins je suis impressionné.


---------------
trainoo.com, c'est fini
n°2241951
youmoussa
Ecrou-vis
Posté le 01-11-2014 à 16:36:16  profilanswer
 

J'essaie d'y mettre du mien, mais parler d'agressivité sur twitter etc quand on voit ton comportement ici, c'est pas facile tous les jours je t'assure.
 
J'ai rien a gagner a t'aider. Pourtant j'essaie de le faire sur mon propre temps, parce que je pense qu'on peut faire beaucoup de choses avec le framework ( quand on voit certaines applis chiadées, c'est quand même impressionnant), et que ce sont les outils du futur.
Du coup comprendre où sont les problèmes ( documentation et/ou limitation technique ) m'intéresse en tant que contributeur.
 
Mais 90% de tes interventions ici ou ailleurs, c'est pour dire que X ou Y c'est de la merde... C'est fatiguant et ça donne pas envie de t'aider.


Message édité par youmoussa le 01-11-2014 à 16:37:02

---------------
L'humain est celui « qui agit puis qui pense : ce n’est pas parce qu’il soutient telle position qu’il agit de telle manière, mais parce qu’il a agi (comme il a été amené à le faire) qu’il va adopter telle position
n°2241952
nraynaud
lol
Posté le 01-11-2014 à 17:11:32  profilanswer
 

hum ok, tu veux comprendre où sont les problèmes, mais sans qu'on les pointe du doigt.
 
Je pense que le logo et l'arrangement de couleurs sur le site sont sympas. ça t'aide ? tu te sens mieux ?
 
Quand à savoir si je suis quelqu'un qui n'hésite pas à soulever les points négatifs ? oui. Et alors ? C'est comme ça que je suis, je suis pas un bisounours.
 
Je vends pas ma soupe comme si elle allait sauver le monde, et quand je vois quelqu'un qui le fait alors je me fais un malin plaisir à relever les merdes passées sous silence dans le tuto. J'en ai plein le cul de la pub sans substance des mecs dont le langage ou le framework va sauver le monde, et quand je me pointe pour l'utiliser parce que bon, il faut bien en choisir un, c'est Beirut autant que chez le voisin. Moi j'ai plus rien à vendre, mon projet est pas en état d'être releasé et c'est bien comme ça, mon dernier projet est hors-ligne, ça m'évite d'être comme tous ces cons dont la dernière création va sauver l'Afrique. J'ai plus d'employeur et au moins je pousse pas le projet de l'un de ces crétins qui veut être au-dessus de la meute.  
 
Surtout qu'il y a un léger problème d'alignement des objectifs quand tous les committeurs d'un framework sont consultants sur la chose, ils ont intérêt à ce qu'un max de monde se lance dedans, mais ait besoin d'aide professionnelle par la suite. Et ça donne des phrases un peu bizarres genre "sur mon propre temps", t'en connais beaucoup des gens payés pour être ici ? Ma PR que Stefan Penner a mergé hier il faut que j'aille réclamer de la thune ? Moi je suis pas consultant sur les rares projets open source sur lesquels j'envoie des PR, j'ai rien à vendre.


---------------
trainoo.com, c'est fini
n°2246333
nraynaud
lol
Posté le 17-12-2014 à 12:13:52  profilanswer
 

J'ai des promises, c'est cool, c'est jeune, tout ça, est-ce qu'il y a un système pour intégrer un stop et un rapport de progression ?


---------------
trainoo.com, c'est fini
n°2246835
tryptique
Stay hungry, stay foolish
Posté le 24-12-2014 à 10:25:58  profilanswer
 

[:drapal]
J'essaye de migrer un CRM vers une appli ember (backend en PHP/Symfony). Pour l'heure j'en suis juste à l'étape de la gestion de la connexion des utilisateurs avec ember-simple-auth.


---------------
"J'ai les goûts les plus simples du monde, je me contente du meilleur" O. Wilde - Freedom of time is the new luxury. Time to sleep, work, play, relax, travel, inspire and get inspired. Time to write your story.
n°2246898
youmoussa
Ecrou-vis
Posté le 24-12-2014 à 18:35:44  profilanswer
 

nraynaud a écrit :

J'ai des promises, c'est cool, c'est jeune, tout ça, est-ce qu'il y a un système pour intégrer un stop et un rapport de progression ?


 
Ça fait pas partie de la spec.  
 
https://promisesaplus.com
 
Tu dois pouvoir avoir le contrôle sur l'événement asynchrone pour obtenir ces infos et arrêter le processus toi même.

n°2246899
youmoussa
Ecrou-vis
Posté le 24-12-2014 à 18:36:31  profilanswer
 

tryptique a écrit :

[:drapal]
J'essaye de migrer un CRM vers une appli ember (backend en PHP/Symfony). Pour l'heure j'en suis juste à l'étape de la gestion de la connexion des utilisateurs avec ember-simple-auth.


 
Hello,
 
Quelle type d'authentification utilises tu avec ton backend?

n°2246900
tryptique
Stay hungry, stay foolish
Posté le 24-12-2014 à 18:51:46  profilanswer
 

youmoussa a écrit :

Hello,
 
Quelle type d'authentification utilises tu avec ton backend?


OAuth2.


---------------
"J'ai les goûts les plus simples du monde, je me contente du meilleur" O. Wilde - Freedom of time is the new luxury. Time to sleep, work, play, relax, travel, inspire and get inspired. Time to write your story.
n°2246902
youmoussa
Ecrou-vis
Posté le 24-12-2014 à 18:56:51  profilanswer
 

Ça doit se faire relativement simplement du coup  :jap:

n°2246904
tryptique
Stay hungry, stay foolish
Posté le 24-12-2014 à 19:20:41  profilanswer
 

Oui :jap:
Je m'attaquerai au cœur de l'appli en janvier :o


Message édité par tryptique le 24-12-2014 à 19:20:55

---------------
"J'ai les goûts les plus simples du monde, je me contente du meilleur" O. Wilde - Freedom of time is the new luxury. Time to sleep, work, play, relax, travel, inspire and get inspired. Time to write your story.
n°2247085
nraynaud
lol
Posté le 30-12-2014 à 00:31:31  profilanswer
 

ok, j'ai un truc super-indirect, accrochez-vous.
 
J'ai un modèle ember data:

Code :
  1. var JobSummary = DS.Model.extend({
  2.            name: attr('string', {defaultValue: 'Unnamed Job'}),
  3.            job: DS.belongsTo('job', {inverse: 'jobSummary', async: true})
  4.        });


 
il sert juste à indexer les jobs pour pouvoir présenter une liste de jobs sans ré-hydrater les jobs (d'où le async). Je sais pas faire mieux avec firebase.
 
dans le template j'ai:

{{#each model}}
                {{#link-to "job" this.job classNames="list-group-item"}}{{name}}{{/link-to}}
            {{else}}
                No job yet.
            {{/each}}


et le this.job ré-hydrate le modèle (pour chaque job) et j'ai perdu.
Est-ce qu'il y a une feinte pour aller chercher l'id qui est sur un "belongsTo" sans ré-hydrater le modèle, et construire l'url et rien ramener de la base tant que c'est pas cliqué ?


---------------
trainoo.com, c'est fini
n°2247086
nraynaud
lol
Posté le 30-12-2014 à 03:44:56  profilanswer
 

pour l'instant j'ai utilisé  

{{#link-to "job" this._data.job.id classNames="list-group-item"}}{{name}}{{/link-to}}


 
(jobSummary._data.job.id)
Je sais pas ce qui serait une méthode officielle.


---------------
trainoo.com, c'est fini
n°2247258
youmoussa
Ecrou-vis
Posté le 04-01-2015 à 05:55:32  profilanswer
 

pourquoi -hydrater? Ils sont déjà chargés ?

n°2247280
nraynaud
lol
Posté le 04-01-2015 à 16:01:34  profilanswer
 

sur la page d'accueil de l'utilisateur, j'ai la liste de ses jobs:
http://i.imgur.com/78TfWWe.png

 

pour afficher cette liste, j'avais:

Code :
  1. Visucam.IndexRoute = Ember.Route.extend({
  2.            model: function () {
  3.                if (this.get('firebase.isAuthenticated'))
  4.                    return this.store.find('job');
  5.                return null;
  6.            }
  7.        });
 

et ce truc ré-hydrate tous les jobs de l'utilisateur, ce qui prend un temps fou et télécharge une tonne de bordel (des modèles 3D entre autre).

 

du coup j'ai dé-normalisé avec une entité jobSummary:

Code :
  1. var JobSummary = DS.Model.extend({
  2.            name: attr('string', {defaultValue: 'Unnamed Job'}),
  3.            job: DS.belongsTo('job', {inverse: 'jobSummary', async: true})
  4.        });


Message édité par nraynaud le 04-01-2015 à 16:05:34

---------------
trainoo.com, c'est fini
n°2247298
youmoussa
Ecrou-vis
Posté le 05-01-2015 à 00:43:42  profilanswer
 

Je procederais différemment. Tu n'as pas 2 routes distinctes pour job et job summary, non ?

 

Si tu n'as qu'une route, utilise le job summary dans le link-to.

 

Ensuite dans `afterModel` de JobSummaryRoute, retourne simplement `model.get('job')`


Message édité par youmoussa le 05-01-2015 à 00:44:41
n°2249940
youmoussa
Ecrou-vis
Posté le 01-02-2015 à 20:24:14  profilanswer
 

Petit update du début d'année
 

  • Emberconf qui a lieu début mars à Portland, OR est complet. Qqn y va ?
  • Proposition pour Ember 2.0 avec un chemin clair pour upgrader les applis existantes (contrairement à Angular 2.0 qui va forcer la réecriture complète des applis )
  • HTMLBars qui va arriver avant 2.0



Message édité par youmoussa le 01-02-2015 à 20:26:18
n°2250166
LeRiton
Posté le 05-02-2015 à 10:49:50  profilanswer
 

Questions tournées vers Youmoussa, mais je suis intéressé par tous les avis :o
 
Tu utilises / recommande Ember Data ? Sinon, quoi d'autre et dans tous les cas, pourquoi ?
 
Niveau Ember CLI, pourquoi Broccoli plutôt que Gulp, Grunt ou simple un script NPM ?
 
En bonus, tu as un avis sur cet article (on se penche seulement maintenant sur la question de toolchain) ?

n°2250271
youmoussa
Ecrou-vis
Posté le 06-02-2015 à 17:54:08  profilanswer
 

J'utilise Ember Data.

 

Les alternatives sont Ember Model ou de tout gérer à la main( Zendesk avait mis autre chose en open source, je ne me souviens plus du nom ).

 

Autant Ember a atteint un niveau de maturité qui rend son utilisation très agréable, autant Ember Data peut encore être très "work in progress". Ce que ED cherche à faire est très compliqué, ce n'est pas pour rien qu'il n'y a pas vraiment d'alternatives/équivalent ni pour Ember, ni dans les frameworks concurrents.
Et la documentation est quasi inexistante :/

 

C'est pourtant bien puissant et marche bien dans beaucoup de cas. Je tiens à préciser aussi qu'un gros effort a été fait depuis 1 an sur ce projet, et que malheureusement pour moi, je suis coincé sur un projet depuis 6 mois qui utilise une ancienne version. Mais les dernières releases fonctionnent apparemment beaucoup mieux car certains problèmes architecturaux ont été résolus et un effort sur les performances a été fait.

 

Je l'utilise sur tous mes projets, mais je sais aussi que je peux rentrer dans le code si besoin. Encore une fois, la communauté est très réactive, faut pas hésiter à demander sur stackoverflow, discourse ou sur IRC quand tu rencontres un problème ( ou ici :o ).


Message édité par youmoussa le 06-02-2015 à 18:02:01
n°2250272
youmoussa
Ecrou-vis
Posté le 06-02-2015 à 18:00:33  profilanswer
 

Pour le développement, il n'y a pas de question à se poser, Ember-CLI est la voie royale.
 
Comme beaucoup de choses dans Ember, le but n'est pas de réinventer tout, mais d'appliquer au js/navigateur les concepts éprouvés côté serveur. Le constat qui a été fait est qu'il n'existait globalement que des task managers pour js ( Grunt ) et rien d'équivalent/performanand à l'asset pipeline qui avait fait la joie des développeurs Rails à sa sortie.
 
npm est à la base un package manager comme bower. Ce n'est pas fait pour "builder" une grosse appli js ( avec beaucoup de fichiers et de type de fichiers différents ).
 
L'objectif de Broccoli, est de dire qu'il n'est pas acceptable pour un dev d'attendre 30 secondes que qqch regenere les fichiers à chaque fois que tu sauvegardes une modification ( et que tu dois raffraichir ton navigateur plusieurs fois jusqu'à ce soit correctement chargé ).

n°2250552
nraynaud
lol
Posté le 11-02-2015 à 03:46:47  profilanswer
 

quelqu'un a une solution complète pour les numberfields ?
 
http://stackoverflow.com/questions [...] ber-fields
ici on voit qu'ils on mis les attributs en HTML, mais ils ont pas mis le parseFloat() qui va avec, et je galère à le faire (et si ça gérait les infini, ça serait cool)
 
j'ai fait ça: https://github.com/nraynaud/webgcod [...] i/views.js
mais en fait c'est pas suffisant, parce que "value" et "numericValue" se désynchronisent, j'arrive pas à le faire correctement.


---------------
trainoo.com, c'est fini
n°2251254
LeRiton
Posté le 20-02-2015 à 10:29:33  profilanswer
 

Petite question à propos de l'instrumentation.
 
Pour une appli très simple pour laquelle je ne souhaite pour le moment pas mettre en place d'AMD / ES6 module / whatever, j'ai l’impression que mon seul choix pour les templates est de tout faire vivre dans le index.html.
 
Ma question se résume à : je veux mettre mes templates HTMLBars (Ember 1.10) dans des .hbs plutôt que tout dans l'index.html, quel choix s'offre à moi pour simplement générer un templates.js sans pour autant devoir mettre en place de l'AMD ?
 
Ember CLI demande de se conformer à la syntaxe d'un resolver ES6, en plus d'être une usine à gaz buggée sous Windows et qui m'impose d'autres choix architecturaux. Le plugin gulp-htmlbars se rapproche le plus de mon besoin, mais la configuration ciblant Ember me demande là encore de me conformer à une syntaxe ES6 de ce que j'ai pu comprendre de l'exemple d'ember-rocks.
 
Je rate quelque chose ?

n°2251361
gatsu35
Blablaté par Harko
Posté le 22-02-2015 à 08:17:13  profilanswer
 

nraynaud a écrit :

quelqu'un a une solution complète pour les numberfields ?
 
http://stackoverflow.com/questions [...] ber-fields
ici on voit qu'ils on mis les attributs en HTML, mais ils ont pas mis le parseFloat() qui va avec, et je galère à le faire (et si ça gérait les infini, ça serait cool)
 
j'ai fait ça: https://github.com/nraynaud/webgcod [...] i/views.js
mais en fait c'est pas suffisant, parce que "value" et "numericValue" se désynchronisent, j'arrive pas à le faire correctement.


Tu veux faire quoi en fait ?

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  9  10  11

Aller à :
Ajouter une réponse
 

Sujets relatifs
Comment créer un site web qu'on peut gérer avec un CMS après ?créer un fichier zip et le télécharger
Quelle solution pour créer une base de données ?Besoin d'une personne pour me créer une page accès membre.
Créer une page web html avec zone pour laisser un commantairecréer un rapport xml avec les outils Blindeelephant, waffit
[RESOLU] Créer un CSV à partir d'une chaîne en phpApplications bloquées par Java
Créer un site e-commercecréer son site en 10 minutes ?
Plus de sujets relatifs à : Ember.js - Framework JS - Ember Octane disponible !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR