KnockOut无法解析绑定

时间:2013-09-06 14:06:54

标签: javascript jquery .net knockout.js

我正在阅读其他答案,但我找不到解决方案,错误说: 错误:无法解析绑定。消息: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');
    };

广告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的回应是:

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"

观点是:

    <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。 为什么它说它不能绑定它,如果它在模型中并且它有结果?

2 个答案:

答案 0 :(得分: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。然后你得到广告推广。您进行了ajax调用,并且成功后,再次设置selectedAd,但是您正在使用返回的原始数据对象进行调用。

function Advertisement(data) { ... }

然后

myViewModel.selectedAd(new Advertisement(data));

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

答案 1 :(得分:1)

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

在尝试绑定到它的属性之前,您应该检查selectAd是否为null。您可以使用knockout selectedAd包装整个<div data-bind="with: $root.selectedAd"></div>容器,以确保它在呈现/绑定之前为非null。

所以只需用if包装你的整个标记即可解包<!-- ko if: $root.selectedAd() --><!-- /ko -->,确保它不为空,并且在该元素为非空之前不会尝试渲染。

selectedAd