1

私は他の回答を読んでいましたが、解決策が見つかりません。エラーは次のように述べています:エラー:バインディングを解析できません。メッセージ: ReferenceError: AdvertisementLegs が定義されていません。Bindings の値: foreach: AdvertisementLegs。モデルで定義されているため、理由がわかりません。

モデルはこちら

メイン Model.js

self.selectedAd = ko.observable();

    self.selectAd = function (item, data) {
        self.selectedAd = ko.observable(new AdvertisementMgr());

        self.advertisementManager().getAdvertisementById(item);
        $('#windowEditAd').jqxWindow('open');
    };

Model.js

var self = this;

//URLS

self.CompanyName = ko.observable("");
//Lists
self.AdvertisementLegs = ko.observableArray();

    self.getAdvertisementById = function (dataItem) {
    $.ajax({
        cache: false,
        url: mViewModel.apiUrl + 'Advertisement',
        type: "GET",
        contentType: "json",
        dataType: "json",
        data: {
            adId : dataItem.AdvertisementId()
        },
        success: function (data) {

            mViewModel.selectedAd(data);
        },
        error: function (xhr, status, error) {
            alert(error.message);
        }
    });
};

json 応答は次のとおりです。

会社名
    「フロッサム・ストラテジーズ株式会社」


広告脚
    [Object { AdvertisementLegId=6, Action="BUYER", Volume=1, más...}]

0
    Object { AdvertisementLegId=6, Action="BUYER", Volume=1, マス...}

AdvertisementLegId
    6

アクション
    "買い手"

価格
    0

広告ID
    4

AdvertisementLegType
    "TL"

ビューは次のとおりです。

    <div data-bind="with: $root.selectedAd">

    <span data-bind="text: CompanyName"></span>     
    <input data-bind="value: CompanyName" type="text" class="txt4 leg_data_vol1" style="width: 50px; text-align: center;" id="leg_data_vol1" />




    <table border="0" cellspacing="0" cellpadding="0" class="volaxe-table">
        <tbody data-bind="foreach: AdvertisementLegs ">
            <tr >
                <td>

                    lalla

                    <input data-bind="value: Volume" type="text" class="txt4 leg_data_vol1" style="width: 50px; text-align: center;" id="leg_data_vol1" />
                </td>
            </tr>

        </tbody>
    </table>
 </div>

CompanyName に問題はありません。問題は配列にあり、Message: ReferenceError: AdvertisementLegs が定義されていません。モデル内にあり、結果がある場合、バインドできないと言うのはなぜですか?

4

2 に答える 2

2
self.selectedAd = ko.observable(new AdvertisementMgr());

applyBindings を呼び出してから を呼び出すとselectAd、オブザーバブル参照が新しいオブザーバブルで上書きされるため、これは良くありません。あなたがしたい:

self.selectedAd(new AdvertisementMgr());// Or do you?

確かにこれは想定されていません:

self.selectedAd(new Advertisement()); // ?

また、getAdvertisementById メソッドで気づいたことですが、次のようにします。

mViewModel.selectedAd(data); // No bueno

self.selectAd 関数が起動し、selectedAd を新しい AdvertisementMgr に設定します。次に、AdvertisementById を取得します。ajax 呼び出しを行い、成功したら selectedAd を再度設定しますが、戻ってきた生データ オブジェクトを使用してそれを行っています。

function Advertisement(data) { ... }

それで

myViewModel.selectedAd(new Advertisement(data));

Advertisement モデルで、すべてのプロパティがデフォルト値に設定されていることを確認し、オブザーバブルである必要があるプロパティがオブザーバブルとして設定されていることも確認します。

于 2013-09-06T17:45:08.573 に答える
1

これは、初期バインディングが適用されると、selectedAdとして作成されたときに null として定義され、 in に設定されるまでko.observable()プロパティがないためです。AdvertisementLegsnew AdvertisementMgr()selectAd

selectedAdプロパティにバインドする前に、それが null でないことを確認する必要があります。コンテナー全体<div data-bind="with: $root.selectedAd"></div>をノックアウトでラップしてif、レンダリング/バインドする前に null でないことを確認できます。

したがって、マークアップ全体<!-- ko if: $root.selectedAd() --><!-- /ko -->を unwrapsselectedAdでラップし、それが null でないことを確認し、その要素が null でなくなるまでレンダリングを試みません。

<!-- ko if: $root.selectedAd() -->
<div data-bind="with: $root.selectedAd">

  <span data-bind="text: CompanyName"></span>     
  <input data-bind="value: CompanyName" type="text" class="txt4 leg_data_vol1" style="width: 50px; text-align: center;" id="leg_data_vol1" />
  <table border="0" cellspacing="0" cellpadding="0" class="volaxe-table">
    <tbody data-bind="foreach: AdvertisementLegs ">
        <tr >
            <td>
                lalla
                <input data-bind="value: Volume" type="text" class="txt4 leg_data_vol1" style="width: 50px; text-align: center;" id="leg_data_vol1" />
            </td>
        </tr>

    </tbody>
  </table>
</div>
<!-- /ko -->
于 2013-09-06T16:40:19.790 に答える