我正在阅读其他答案,但我找不到解决方案,错误说: 错误:无法解析绑定。消息: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。 为什么它说它不能绑定它,如果它在模型中并且它有结果?
答案 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}之前没有任何属性AdvertisementLegs
在new AdvertisementMgr()
。
在尝试绑定到它的属性之前,您应该检查selectAd
是否为null。您可以使用knockout selectedAd
包装整个<div data-bind="with: $root.selectedAd"></div>
容器,以确保它在呈现/绑定之前为非null。
所以只需用if
包装你的整个标记即可解包<!-- ko if: $root.selectedAd() --><!-- /ko -->
,确保它不为空,并且在该元素为非空之前不会尝试渲染。
selectedAd