2017-03-03 5 views
0

Je pense que je vais me sentir stupide une fois que je vois la réponse, mais je ne peux pas comprendre pourquoi or fonctionne, mais and n'est pas sur ce ComputedProperty. Le tutoriel a suggéré que je devrais utiliser and, mais je ne peux pas comprendre comment je ferais cela si cela ne fonctionne pas.Pourquoi "ou" fonctionne-t-il mais "et" ne figure pas dans ma propriété Ember.ComputedProperty?

Pour commencer je suis nouveau à Ember et familier mais pas vraiment à l'aise avec javascript, c'est pourquoi je suppose que j'ai de la difficulté à comprendre ce qui se passe ici.

J'ai deux propriétés dont j'ai besoin à la fois true avant un bouton isDisabled. Je passe chacun d'entre eux à ses propres propriétés qui inversent leur état booléen afin que isDisabled reste actif sur un bouton jusqu'à ce que les propriétés d'origine soient retournées.

contact.js

emailAddress: '', 
    message: '', 

    //**original properties** 
    isValid: Ember.computed.match('emailAddress', /^[email protected]+\..+$/),//starts as false 
    validMessage: Ember.computed.gte('message.length', 5),//starts as false 

    //**my reversing boolean properties** 
    notYet: Ember.computed.not('isValid'),//starts as true 
    notNow: Ember.computed.not('validMessage'),//starts as true 


//isDisabled must be true to be active disabling button 
    isDisabled: Ember.computed.or('notYet', 'notNow'),//starts as true 

Si je mets au format emailAddress correct:

emailAddress = true 
notYet = false 
isDisabled = true //still 

Si je puis mettre un validMessage de 5 caractères ou plus

validMessage = true 
    notNow = false 
    isDisabled = false //now 

Pourquoi "ou" travailler pour cela, pourquoi pas "et" ou "pas"? Je ne suis pas sûr de savoir si je comprends votre question correctement;

Répondre

1

C'est juste de lois de Morgan.

Qu'est-ce que vous voulez est d'être le seul bouton être activé lorsque les deux valeurs sont valides. vous voulez que le bouton est activée lorsque isValid and validMessage.

Cela signifie que vous voulez bouton est désactivé lorsque not(isValid and validMessage).

En raison de la loi de Morgan, cela équivaut à (not isValid) or (not validMessage).

Parce que notYet est égal à not isValid il s'ensuit que (not isValid) or (not validMessage) est égal à notYet or (not validMessage).

Et parce que notNow est égal à not validMessage il en résulte que notYet or (not validMessage) est égal à notYet or notNow.

Et c'est exactement votre isDisabled. C'est pourquoi votre code fonctionne. Juste des maths simples. Et bien sûr dans ce contexte notYet or notNow serait quelque chose d'autre. Toutefois, cela serait équivalent:

isEnabled: Ember.computed.and('isValid', 'validMessage'), 
isDisabled: Ember.computed.not('isEnabled'), 
0

mais autant que je comprends, vous voulez isDisabled pour être vrai seulement lorsque vos deux valeurs d'origine (isValid et validMessage) sont vraies. Ce que vous devez faire est soit "ET ces deux propriétés" ou "PAS le résultat OUED de NON de chaque valeur." Vous pouvez voir le twiddle que j'ai préparé et voir tout ce qui (ANDing, NOTing, etc) lié aux propriétés calculées fonctionne comme prévu. J'espère que cela aide.

+0

Merci de répondre. En bref ce que je dis est "Mon code fonctionne, je ne comprends pas pourquoi mon code fonctionne." – Lenocam