2017-12-21 14 views
0

Ich habe eine Liste von "Angelegenheiten." Jede Sache hat eine _id und einen Namen.CustomHelper innerhalb {{# jeder}} Block

Ich habe eine "Transaktion." Jede Transaktion gehört zu einer Angelegenheit mit Bezug auf die _id der Angelegenheit über eine Eigenschaft transaction.matterId.

Ich arbeite derzeit an einer Benutzeroberfläche, um Änderungen an der Transaktion zu ermöglichen, einschließlich der Änderung der Angelegenheit, der die Transaktion zugewiesen ist. Wie folgt aus:

Enter date: 

Select a matter: (this is the culprit) 

Enter the amount: 

ich Lenker verwende für jede Angelegenheit eine Bootstrap wählen Eingang mit einer Option zu erzeugen - das heißt, „eine Sache auswählen ...“ Dies ist leicht mit Lenker sitzt {{# each}} Block Helfer. Alle Angelegenheiten werden korrekt als Optionen angezeigt und der Wert jeder Option wird korrekt zugewiesen. Kein Problem so weit ...

Allerdings möchte ich die Option, deren Wert die transaction.MatterId vorausgewählt werden, da dies ein Update-Bildschirm ist. Dazu rufe ich meinen benutzerdefinierten "IfEquals" -Helfer in meinem Block {{# each}} auf. Der Lenker Vorlage ist wie folgt:

<div>Matter: {{ transaction.matterId}}</div> <-- I can see the matterId here. 
<div class='form-group'> 
    <label for="selMatter">Case</label> 
    <select required id="selMatter" name="matterId" class="form-control"> 
     {{# each matters }} 
      <option value='{{ _id }}' {{ ifEqual _id ../transaction.matterId "selected" "" }} >{{ name }}</option> 
     {{/ each }} 
    </select> 
</div> 

Der Brauch Helfer dies:

ifEqual: function (obj, value, trueString, falseString) { 
     return ((obj===value) ? trueString : falseString); 
} 

Lassen sich die ersten <div> sagt eine transaction.MatterId von „5“ Es wird eine (und nur eine) Option mit einem Wert von "5" geben.

In der Lenkervorlage habe ich alle möglichen Möglichkeiten ausprobiert, um {{IfEqual}} zu versuchen, die 2 Werte richtig zu vergleichen. Ich versuchte die transaction.matterId ohne "../", um zu sehen, ob es ein Kontextproblem sein könnte. Kein Glück. Ich habe versucht, mit einem Lenker Teilausdruck (sogar mit seiner eigenen Hilfsfunktion). Nee.

Ich bekomme nicht die richtigen Werte innerhalb des {{IfEqual}} Helfers, und deshalb kann ich, obwohl der passende <option> da ist, den Lenker nicht das Attribut "selected" hinzufügen lassen.

Hier ist, was ich glaube, um der richtige Ort zu sein, um zu sehen, aber ich sehe nicht, was ich vermisse. http://handlebarsjs.com/expressions.html

+0

Die Vorlage scheint mir fein . Der einzige Grund, dass ich daran denken könnte, würde dies verhindern, wenn '_id' und' transaction.matterId' verschiedene Typen hätten, zum Beispiel String und Number. – 76484

+0

@ 76484 Ich denke, sie sind verschiedene Typen - also wirft die toString() in meiner Antwort unten. Ich habe versucht, den ursprünglichen Helfer {{ifEqual}} im obigen Code mit .toString() zu verwenden, aber Lenker lehnt es mit einem parseError ab. Es mag .toString() nicht. Gibt es irgendwelche Out-of-Box-Fix, oder muss ich noch auf einen anderen, benutzerdefinierten Helfer wie unten zurückgreifen? –

+1

Das Update sollte wirklich in Ihrer Datenschicht sein, die ID sollte immer von einem einheitlichen Typ sein. Wenn dies nicht möglich ist, würde ich empfehlen, einen 'ToString' -Helfer zu erstellen, der Ihre Werte vor dem Übergeben an den' ifEqual'-Helper stringt.Alternativ könnten Sie den 'ifEqual' -Helfer aktualisieren, um' obj' und 'value' in Strings umzuwandeln, aber ich mag diesen Ansatz nicht, weil er den Helfer ein wenig unehrlich macht. – 76484

Antwort

0

Nun, ich habe es endlich. Wenn jemand auf dieses Szenario kommt, hier ist was für mich gearbeitet:

Lenker Vorlage:

<div class='form-group'> 
    <label for="selMatter">Case</label> 
    <select required id="selMatter" name="matterId" class="form-control"> 
     {{# each matters }} 
      {{{ makeOption _id ../transaction.matterId name }}} 
     {{/ each }} 
    </select> 
</div> 

Hier ist die {{{makeOption}}} Helfer:

makeOption: function (optionValue, dataValue, displayText) { 
    myOption = "<option value='" + optionValue + "'"; 

    if (optionValue.toString() === dataValue.toString()) 
    myOption += " selected"; 

    myOption += ">" + displayText + "</option>"; 

    return myOption; 
}, 
Verwandte Themen