如何处理一对多关系Knockout-Entity Framework

时间:2014-02-20 19:36:13

标签: entity-framework knockout.js

所以我有一个简单的结构,其中一次购买有一系列费用,每个费用都有一个帐户(塑料,现金,塑料#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的帐户是空的:

enter image description here

那么你如何在淘汰赛中处理$ 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;
    };

感谢。

1 个答案:

答案 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>

注意:这两种方法都可以在小提琴中使用,因此根据所使用的方法提供了一些不需要的属性。