我一直在使用简单而干净的访问来删除从breeze数据服务填充的表中的项目。一切顺利,直到我开始在显示的表格中包含导航属性。现在每当我使用删除功能时,我都会收到Uncaught TypeError: Cannot read property 'BoardName' of null
的错误。
我的数据库实体设置为:
public class SpecificAdapter
{
public int Id { get; set; }
public string PbaNumber { get; set; }
public int NumberOfPorts { get; set; }
public int AdapterId { get; set; }
public virtual Adapter Adapter { get; set; }
}
public class Adapter
{
public int Id { get; set; }
public string BoardName { get; set; }
public string DeviceId { get; set; }
public virtual ICollection<SpecificAdapter> SpecificAdapters { get; set; }
}
我正在以这种方式在Breezejs中使用数据服务基础:
var loadSpecificAdaptersTable = function () {
return em.executeQuery(breeze.EntityQuery.from('SpecificAdapters').expand('Adapter'));
};
在视图模型中加载如下:
adaptersDataService.loadSpecificAdaptersTable()
.then(function (data) { specificAdapters(data.results); })
.fail(function (error) { logger.error(error.message, "loadSpecificAdaptersTable failed during initialization"); });
我将它映射到html中,如下所示:
<table class="table tablesorter">
<thead>
<tr>
<th data-bind="sort: {arr: specificAdapters, prop: 'Adapter().BoardName'}">Board Name</th>
<th data-bind="sort: {arr: specificAdapters, prop: 'PbaNumber'}">Pba Number</th>
<th data-bind="sort: {arr: specificAdapters, prop: 'NumberOfPorts'}"># Ports</th>
<th data-bind="sort: {arr: specificAdapters, prop: 'FirmwareVersion'}">Firmware Version</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: specificAdapters">
<tr>
<td data-bind="text: Adapter().BoardName"></td>
<td data-bind="text: PbaNumber"></td>
<td data-bind="text: NumberOfPorts"></td>
<td data-bind="text: FirmwareVersion"></td>
<td>
<button data-bind="click: $parent.editSpecificAdapter" class="btn">Edit</button>
</td>
<td>
<button data-bind="click: $parent.deleteSpecificAdapter" class="btn">Delete</button>
</td>
</tr>
</tbody>
</table>
在Adapter().BoardName
作为参考添加到表格之前,我可以点击删除按钮,一切正常。现在我收到一个错误。删除逻辑如下:
var deleteSpecificAdapter = function (item) {
item.entityAspect.setDeleted();
specificAdapters.remove(item);
};
运行item.entityAspect.setDeleted();
时会抛出错误。将数据绑定添加到Adapter().BoardName
是否会以不能很好地映射回来的方式更改item
变量?我是否需要使用不同的逻辑来确定实际项目,还是需要以不同方式绑定click事件以获取foreach
中特定的,未重新映射的项目?
答案 0 :(得分:2)
通过绑定到BoardName,您可以创建计时问题。由于在父上下文完全更新之前清除了值,因此会引发错误。有几种方法可以解决这个问题 -
<td data-bind="with: Adapter"><span data-bind="text: BoardName"></span></td>
这只会在填充适配器时绑定到BoardName属性
<td data-bind="if: Adapter"><span data-bind="text: BoardName"></span></td>
这只会在Adapter有值时评估内跨的数据绑定。