所以我有一个简单的结构,其中一次购买有一系列费用,每个费用都有一个帐户(塑料,现金,塑料#2 ......)。
所以我的api得到的json与此类似:
[
{"$id":"1","Id":1,"Name":"apple","Value":100.0,"AccountId":1,"Account":
{"$id":"2","Id":1,"Name":"Cash"}},
{"$id":"3","Id":2,"Name":"pear","Value":50.0,"AccountId":1,"Account":
{"$ref":"2"}},
{"$id":"4","Id":3,"Name":"raspberry","Value":10.0,"AccountId":1,"Account":
{"$ref":"2"}}
]
我看到我的json每次需要时都没有写我的现金账户,它是用
引用它 {"$ref":"2"}
,其中
{"$id":"2","Id":1,"Name":"Cash"}
所以当我用这个html渲染我的表时:
<table>
<tbody data-bind="foreach: gastos">
<tr>
<td data-bind="text: $data.id"></td>
<td data-bind="text: $data.name"></td>
<td data-bind="text: $data.value"></td>
<td data-bind="text: $data.account.Name"></td>
<td>
<button type="button" class="btn btn-xs">
<i class="glyphicon glyphicon-trash"></i>
</button>
</td>
</tr>
</tbody>
</table>
我明白了,因为pear和raspberry的帐户是空的:
那么你如何在淘汰赛中处理$ ref?
我要映射到&#39; gastos&#39;这样:
$.getJSON('@ViewBag.GastosUrl', function (data) {
data.forEach(function(o) {
gastos.push(new gastoVM(o.Id, o.Name, o.Value, o.Account));
});
});
var gastoVM = function(Id, Name, Value, Account) {
var self = this;
self.id = Id;
self.name = Name;
self.value = Value;
self.account = Account;
};
感谢。
答案 0 :(得分:1)
我不熟悉entity-framework
但是根据提供的数据,我们提供了几个选项(JSFiddle):
在gastos
旁边建立帐户信息。并且仅提供$id
或$ref
以供日后参考。
var vm = {
gastos: [],
accounts: {},
accountLookup: function(accountId){
return this.accounts[accountId];
}
}
//... inside AJAX call
var accountId = o.Account["$id"]
if(accountId)
{
vm.accounts[accountId] = o.Account;
}
使用ko utility method在您的阵列中查找帐户。
accountLookupByUtil: function(accountId) {
var gasto = ko.utils.arrayFirst(this.gastos, function(item) {
if(item.account['$id'] == accountId)
{
return item
}
});
return gasto.account;
}
来自html:
<td data-bind="text: $root.accountLookup($data.accountId).Name"></td>
<td data-bind="text: $root.accountLookupByUtil($data.accountId).Name"></td>
注意:这两种方法都可以在小提琴中使用,因此根据所使用的方法提供了一些不需要的属性。