1

我正在阅读其他答案,但找不到解决方案,错误提示:错误:无法解析绑定。消息:ReferenceError: AdvertisementLegs 未定义;绑定值:foreach: AdvertisementLegs,我找不到原因,因为它在模型中定义:

这是模型

主模型.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响应是:

公司名称
    “Flotsum Strategies, Inc”


广告腿
    [对象 { AdvertisementLegId=6, Action="BUYER", Volume=1, más...}]

0
    对象 { AdvertisementLegId=6, Action="BUYER", Volume=1, más...}

广告LegId
    6

行动
    “买方”

价格
    0

广告编号
    4

广告腿型
    “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 is not defined。为什么它说如果它在模型中并且它有结果就不能绑定它?

4

2 回答 2

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

这不好,因为在你 applyBindings 然后调用之后selectAd,你用一个新的 observable 覆盖你的 observable 引用。你要:

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));

在您的广告模型中,确保将所有属性设置为默认值,并确保将需要成为可观察对象的属性设置为可观察对象。

于 2013-09-06T17:45:08.573 回答
1

这是因为在应用初始绑定时,selectedAd在创建为时定义为 null ,并且在设置为in之前ko.observable()没有任何属性。AdvertisementLegsnew AdvertisementMgr()selectAd

selectedAd在尝试绑定到它的属性之前,您应该检查它不为空。您可以用敲除包装整个<div data-bind="with: $root.selectedAd"></div>容器,if以确保它在渲染/绑定之前不为空。

<!-- ko if: $root.selectedAd() --><!-- /ko -->因此,只需使用unwraps包装您的整个标记selectedAd,确保它不为空,并且在该元素不为空之前不会尝试渲染。

<!-- 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 回答