web-dev-qa-db-ja.com

ノックアウトjs-プロパティが存在するかどうかを確認

以下をノックアウトでレンダリングしようとしています。

<!-- ko with: address-->
<!-- ko if: address1-->
<span style="display : block">
<span data-bind="varchar : address1"></span>
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->
<!-- /ko -->

問題は、アドレスオブジェクトが存在していても、address1パラメータが含まれていない可能性があることです。パラメータ「address1」がnullの場合、ネストされたスパンをレンダリングしないようにノックアウトしたいのですが。現在、次のエラーがスローされます。

Unable to parse bindings. Message: ReferenceError: address1 is not defined;

どんな助けも大歓迎です。

20
Chin

もしそうなら、あなたの秒を動かすだけのケースではないですか?

<!-- ko with: address -->
<span style="display : block">
<!-- ko if: address1 -->
<span data-bind="varchar : address1"></span>
<!-- /ko -->
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->

ViewModelとアドレスの相互関係を確認する必要があるようです。私は問題なくノックアウトページのサンプルでそれを行うことができます:

<h1 data-bind="text: city"> </h1>
<p data-bind="with: coords">
    <!-- ko if: latitude -->
    Latitude: <span data-bind="text: latitude"> </span>,
    <!-- /ko -->
    Longitude: <span data-bind="text: longitude"> </span>
</p>
8
veblock

<!-- ko if: $data.address1 -->を使用すると、address1が未定義の場合でもエラーになりません。

address1が後で入力された場合でも、UIは更新されません(address1は最初は監視可能である必要があります)。

91
RP Niemeyer

さまざまな場所から呼び出されたアドレステンプレートがある場合がありました。

私の「国名」データフィールドは、時々countryName、時々countryDescでした。

私はテンプレートをこれに変更しました:

 <div data-bind="text: $data.countryName || $data.countryDesc"></div>

これは、$dataエラーは発生しません(RP Niemeyerが指摘)

6
Simon_Weaver

この動作の原因は、観測可能な「アドレス」の初期データである可能性があります。

このようにビューモデルを初期化している場合:

this.address = ko.observableArray();

その場合、「address」と「address1」はどちらも未定義です。

回避策は、次のようにコードを "ko if"ステートメントにラップして、ブロックの先頭でデータをチェックすることです。

<!-- ko if: $data --> <br/>
<br/>
<span style="display : block"><br/>
<span data-bind="varchar : address1"></span><br/>
</span><br/>
<span style="display : block"><br/>
<span data-bind="varchar : address2"></span><br/>
</span><br/>
<br/>
<!-- /ko -->
0
ron.camaron