我使用 Breeze 在一个 asp.net mvc 项目上工作。
我有一个页面,我在其中显示有关传输的详细信息,并在其下方的表格中列出链接的传输。
考虑以下实体:
public class Transport
{
[Key]
public int Id { get; set; }
public string TransportNumber { get; set; }
public string Description { get; set; }
public virtual List<LinkedTransport> LinkedTransports { get; set; }
...
}
public class LinkedTransport
{
[Key, Column(Order = 0)]
public int TransportId { get; set; }
[Key, Column(Order = 1)]
public int TransportRelatedId { get; set; }
public virtual Transport Transport { get; set; }
public virtual Transport TransportRelated { get; set; }
}
所以这两个实体允许我定义我的传输和(对于每个)链接的传输。
首先,我将我的(主要)传输加载到一个名为的 observable 中transport
:
var query = entityQuery.from('Transports')
.where('id', '==', transportId)
.expand("LinkedTransports.transportRelated");
query = query.using(breeze.FetchStrategy.FromServer);
请注意我在expand
哪里检索链接的传输。
现在我有以下代码来显示我的传输和链接传输:
<div data-bind="with: transport()">
<input type="text" data-bind="text: transportNumber"></input>
<input type="text" data-bind="value: description"></input>
...
<table data-bind="foreach: linkedTransports">
<tr>
<td data-bind="text: transportRelated().transportNumber()"></td>
<td data-bind="text: transportRelated().description()"></td>
</tr>
</table>
</div>
到目前为止,一切都很好。我可以显示我的主要运输信息以及链接的运输信息。现在我需要让用户添加一些链接的传输。所以我有以下代码:
var createLinkedTransport = function (transpId, transpRelatedId) {
var initialValues = ({
transportId: transpId,
transportRelatedId: transpRelatedId
});
manager.createEntity(entityNames.linkedTransport, initialValues);
};
在运行时,当我调用此函数时,我可以将链接传输添加到我的(主)传输。
我的问题:在我的 foreach 淘汰赛循环中未正确显示添加的元素。我看到表中添加了一个新行,但这一行是空的。我认为问题在于我没有expand
关于我新添加的元素的任何信息,但我不知道如何继续。
知道如何进行吗?
更新
需要明确的是,当我将linkedTransport 添加到我的传输时,在添加之后(并且没有重新加载页面)我无法读取目标(*)linkedTransport 的属性。但是如果我保存更改并重新加载我的页面,那么我可以读取目标链接传输的属性。
当我说“目标链接传输”时,我的意思是由我的 TransportRelatedId (>> public virtual Transport TransportRelated
) 引用的传输。
因此,如果我立即将linkedTransport #123添加到传输#456 THEN(无需重新加载页面),我将无法显示Description
#123 的属性。
<div data-bind="with: transport()">
...
<div data-bind="foreach: linkedTransports">
<label data-bind="text: transportRelated().description()"></label>
</div>
</div>
希望我很清楚。
更新 2
正如 Ward 所建议的,我在添加后立即设置断点linkedTransports
并检查transport().linkedTransports()
. 以下是结果:
- transport().linkedTransports()[0].transport() >> 属性在那里
- 运输().linkedTransports()[0].transportId() >> 1
- transport().linkedTransports()[0].transportNumber >> '123456' (“虚拟”属性,没有帮助)
- transport().linkedTransports()[0].transportRelated() >> null
- transport().linkedTransports()[0].transportRelatedId() >> 5(linkedTransport的id)
所以我的问题是它transportRelated()
是空的。
更新 3
最后我让它工作了。在添加时将添加的(引用的)元素保存在缓存中是很重要的。对于我的情况,我会做类似的事情:
ctxTransport.getTransportById(5, obs);
ctxTransport.createLinkedTransport(1, 5);
所以在调用之前,createLinkedTransport
我getTransportById
用第 5 个 id(linkedTransport 的 id)调用。
另一件重要的事情是我们如何在页面上显示linkedTransports:
<div data-bind="foreach: linkedTransports">
<span class="input-control text">
<!-- ko with: transportRelated -->
<a href="#" class="fg-color-darken" data-bind="attr: { href: '#/generalTransport/' + id(), title: 'Cliquez pour ouvrir ce transport' }, text: transportNumber"></a>
<!-- /ko -->
<i class="icon-remove btn" data-bind="click: $root.removeLinkedTransport" style="cursor:pointer;"/>
</span>
</div>
注意ko with: transportRelated
后面的<a href="#" data-bind="text: id()"
。起初我做错了<a href="#" data-bind="text: transportRelated().id()"
。我们不能这样进行。