2012-04-11 7 views
4

Ich habe eine Variable, die in einigen Fällen nicht deklariert ist, und ich möchte es in einer jQuery-Vorlage verwenden. Das ist, was ich zu erreichen bin versucht, aber es wirft ein * PAYMENT_METHOD nicht definiert ist * Ausnahme:Wie können Sie die Eigenschaften nicht deklarierter Variablen bewerten?

{{if payment_method && (payment_method.id == $value.id)}} 
    // this throws an exception when payment_method is undeclared! 
{{/if}} 

Dies funktioniert:

{{if payment_method }} 
    {{if payment_method.id == $value.id}} 
     // nested works! 
    {{/if}} 
{{/if}} 

aber ich bin nicht so scharf von einer verschachtelten Lösung seit Ich benutze es sehr. Ich verstehe klar, warum der erste Fall den Fehler wirft, was ich suche, ist eine mögliche Abhilfe dafür, ohne auf die zweite Lösung zurückzugreifen.

Dieses Problem läuft wahrscheinlich auf Probleme in js, um Eigenschaften für nicht deklarierte/undefinierte Variablen zu überprüfen. Dies funktioniert:

if("undefined" !== typeof undefinedVariable) { 
    // this works just fine also for undeclared variables 
} 

aber nicht:

if("undefined" !== typeof undefinedVariable.property) { 
    // this throws an exception 
} 

Irgendwelche Ideen?

+0

http://i.stack.imgur.com/xXkvA.jpg – NicoSantangelo

Antwort

0

Sie können die hasOwnProperty-Funktion verwenden, um nach dem Vorhandensein einer Eigenschaft in einem Objekt zu suchen.

+1

Es ist in der Tat eine nützliche Funktion. Das Problem in meinem Fall ist, dass ich nicht nur nach einer möglichen Eigenschaft suche, das Objekt kann sehr wohl nicht einmal existieren. Wie in diesem Fall: if (undeclarednoneexistingobject.hasOwnProperty ('id')) { zurück True; } –

0

Das Problem in js ist, dass Sie überprüfen müssen, ob die Eigenschaft existiert, bevor Sie etwas gegen es testen können, so dass es Zustand ein bisschen unordentlicher machen.

{{if payment_method && payment_method.id && (payment_method.id == $value.id)}} 
+0

Dies funktioniert leider nicht, da jQuery tmpl weiter auswertet, obwohl eine Variable nicht deklariert ist. Das Problem scheint darin zu bestehen, dass das Verhalten von jQuery tmpl mit js in Bedingungsklauseln inkohärent ist. Ich brauchte viel zu viele Stunden, um das zu verstehen, aber Sie können die endgültige Arbeitslösung in meiner Antwort sehen! –

+0

Baq jquery.tmpl :) Ich denke, es ist ein nicht fortgeführtes Projekt, das nie die Beta-Stufe passiert, so dass Probleme erwartet werden. – GillesC

+0

Das ist wirklich bedauerlich, ich hatte große Hoffnungen dafür. Es ist eine große Hilfe, um Ihren Code sauber zu halten und Controller von der Ansicht zu trennen. Ich habe riesige Vorlagen, die wäre purer Unsinn in meine js-Dateien zu setzen ... –

1

Wenn eine undefinierte/nicht deklarierte Variable verwendet wird, werden keine Ausnahmen ausgelöst, aber ihre Eigenschaften werden verwendet. Hier wird es allerdings etwas unscharf.

Wenn Sie für die Existenz dieser nicht deklarierten Variablen durch typeof überprüfen, wertet sie auf falsch (zumindest so dass ich denke, es so tut, wenn die einzige Bedingung ist, ...) und nicht weiter zu prüfen, für weitere Bedingungen. Wenn Sie nur für seine Existenz überprüfen, indem Sie seinen Namen, wertet es falsch, aber die nächste Bedingung keiner bewertet wird, desto weniger ...

Wie auch immer, dies keine Ausnahme wirft:

if(typeof undeclaredVariable !== "undefined" && typeof undeclaredVariable.property !== "undefined") { 
    // this works just fine 
} 

und weder tut:

if(typeof undeclaredVariable !== "undefined" && undeclaredVariable.property) { 
    // this also works just fine but is shorter 
} 

aber dies tut:

if (undeclaredVariable && undeclaredVariable.property) { 
    // the conditional clause does not stop at undeclaredVariable but also checks for undeclaredVariable.id where it throws an exception 
} 

Ohne den tru Verständnis e Mechanismen, wie Bedingungen bewertet bekommen, ist die Antwort auf meine Frage (erfolgreich getestet):

{{if typeof payment_method !== "undefined" && payment_method && (payment_method.id == $value.id)}} 

EDIT: einen undefinierten/nicht angemeldeten Variable lösen eine Ausnahme in js, aber es funktioniert nicht in jQuery tmpl.

js:

if (undeclaredVariable) { 
    // throws an exception 
} 

jQuery tmpl:

{{if undeclaredVariable}} 
    // evaluates to false, but does not throw an exception 
{{/if}} 
+0

Danke! Dies half mir sehr –

2

Hier ist, was Sie brauchen, beste Art und Weise arbeiten in.

try { 
     if (!! someVariable) 
     { 
      //its declared you can use it 
     } 
     else 
     { 
      //its not declared 
     }      

    } 
    catch (e) { 
     //its not declared 
    } 
-1
{{if this.data.payment_method && this.data.payment_method.id == $value.id}}{{/if}} 
0
var foo; 
var bar = 'defined'; 
try{ 
    if(someVariable === 'undefined') { 
    console.log('undefined'); //foo 
    }else{ 
    console.log('declare && defined'); //bar 
    } 
}catch (e){ 
    console.log('undeclared'); //undeclaredVariable 
} 
+1

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um das zu verbessern Qualität Ihres Beitrags. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. – DimaSan

Verwandte Themen