4

場合によっては宣言されていない変数があり、jQueryテンプレートで使用したいと思います。これは私が達成しようとしていることですが、*payment_methodが定義されていません*例外をスローします。

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

これは機能します:

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

しかし、私はそれをたくさん使用しているので、ネストされたソリューションにはあまり熱心ではありません。最初のケースでエラーが発生する理由を明確に理解しています。私が探しているのは、2番目の解決策に頼らずにこれを回避できる可能性があることです。

この問題はおそらく、未宣言/未定義の変数のプロパティをチェックするためのjsの問題に要約されます。これは機能します:

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

しかし、これはしません:

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

何か案は?

4

6 に答える 6

2

未定義/宣言されていない変数を使用する場合、例外はスローされませんが、そのプロパティを使用すると例外がスローされます。ただし、これは少しあいまいになるところです。

この宣言されていない変数の存在をtypeofで確認すると、 falseと評価され(少なくとも私はそう思います。唯一の条件である場合はそうなります...)、それ以上の条件の確認は続けません。その名前だけで存在を確認すると、false と評価されますが、次の条件はそれでも評価されます...

とにかく、これは例外をスローしません:

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

どちらもしません:

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

しかし、これは:

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

条件がどのように評価されるかの真のメカニズムを理解していない場合、私の質問への答えは (正常にテストされています):

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

編集: 未定義/宣言されていない変数を使用すると、js で例外がスローされますが、jQuery tmpl ではスローされません。

js:

if (undeclaredVariable) {
    // throws an exception
}

jQuery tmpl:

{{if undeclaredVariable}}
    // evaluates to false, but does not throw an exception
{{/if}}
于 2012-04-12T11:47:52.063 に答える
1

これがあなたが必要とするものであり、最善の方法で機能します。

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

   }
   catch (e) {
         //its not declared
   }
于 2012-05-02T14:24:31.363 に答える
0

hasOwnProperty 関数を使用して、オブジェクトのプロパティの存在を確認できます。https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/HasOwnPropertyを参照してください

于 2012-04-11T19:35:48.170 に答える
0

jsの問題は、プロパティに対して何かをテストする前に、まずプロパティが存在することを確認する必要があるため、条件が少し面倒になります。

{{if payment_method && payment_method.id && (payment_method.id == $value.id)}}
于 2012-04-11T22:30:00.150 に答える
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
}
于 2016-12-09T03:59:39.280 に答える
-1
{{if this.data.payment_method && this.data.payment_method.id == $value.id}}{{/if}}
于 2014-06-12T08:38:36.220 に答える