Javascript 敲除无法分析绑定

Javascript 敲除无法分析绑定,javascript,jquery,.net,knockout.js,Javascript,Jquery,.net,Knockout.js,我正在阅读其他答案,但我找不到解决方案,错误显示: 错误:无法分析绑定。消息:ReferenceError:未定义AdvertisementLegs;绑定值:foreach:AdvertisementLegs,我找不到原因,因为它在模型中定义: 这是模型 Main Model.js self.selectedAd = ko.observable(); self.selectAd = function (item, data) { self.selectedAd = ko

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

这是模型

Main Model.js

self.selectedAd = ko.observable();

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

        self.advertisementManager().getAdvertisementById(item);
        $('#windowEditAd').jqxWindow('open');
    };
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);
        }
    });
};
广告模型.js

self.selectedAd = ko.observable();

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

        self.advertisementManager().getAdvertisementById(item);
        $('#windowEditAd').jqxWindow('open');
    };
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响应是:

CompanyName "Flotsum Strategies, Inc" AdvertisementLegs [Object { AdvertisementLegId=6, Action="BUYER", Volume=1, más...}] 0 Object { AdvertisementLegId=6, Action="BUYER", Volume=1, más...} AdvertisementLegId 6 Action "BUYER" Price 0 AdvertisementId 4 AdvertisementLegType "TL" 公司名称 Flotsum战略公司 广告腿 [对象{AdvertisementLegId=6,Action=“买方”,卷=1,más..] 0 对象{AdvertisementLegId=6,Action=“买方”,卷=1,más..] 广告合法 6. 行动 “买方” 价格 0 广告ID 4. 广告legtype “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没有问题,问题在于它所说的数组 消息:ReferenceError:未定义AdvertisementLegs。
为什么它说如果它在模型中并且有结果,它就不能绑定它?

这是因为当应用初始绑定时,
selectedAd
在创建为
ko.observable()
时定义为null,并且在设置为
new AdvertisementMgr()之前,它没有任何属性
中选择ad

在尝试绑定到它的属性之前,应该检查
selectedAd
是否不为null。您可以在整个
容器中添加一个knockout
if
,以确保它在呈现/绑定之前不为空

因此,只需使用
包装整个标记,该标记将打开
selectedAd
,确保它不为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 -->

拉拉
这是不好的,因为在应用绑定并调用
selectAd
后,您将用新的可观察引用覆盖可观察引用。你想要:

self.selectedAd(new AdvertisementMgr());// Or do you?
当然这不应该是:

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

我还注意到,在getAdvertisementById方法中,您可以执行以下操作:

mViewModel.selectedAd(data); // No bueno
self.selectAd函数启动并将selectedAd设置为新的AdvertisementMgr。然后你就可以得到广告。您进行了ajax调用,成功后,再次设置selectedAd,但您使用返回的原始数据对象进行设置

function Advertisement(data) { ... }
然后


在您的广告模型中,确保所有属性都设置为默认值,同时确保需要可观察的属性设置为可观察的。

AdvertisementLeg是json中的一个对象,可能是这样,但我不知道如何将其广告化。您的视图模型在哪里?还有什么东西装订好了吗?