gpt4 book ai didi

javascript - 从 Breeze/knockout 中删除会产生 "Cannot read property ' BoardName' of null"

转载 作者:行者123 更新时间:2023-12-02 17:21:39 24 4
gpt4 key购买 nike

我一直在使用简单而干净的访问来删除从 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'));
};

像这样加载到 View 模型中:

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(); 时会引发错误。将数据绑定(bind)添加到 Adapter().BoardName 是否会以无法很好地映射回使用的方式更改 item 变量?我是否需要使用不同的逻辑来确定实际项目,或者是否需要以不同的方式绑定(bind)单击事件,以便从 foreach 获取特定的、未重新映射的项目?

最佳答案

按照您现在的方式绑定(bind)到 BoardName 会产生计时问题。由于该值在父上下文完全更新之前被清除,因此会引发错误。有几种方法可以解决这个问题 -

<td data-bind="with: Adapter"><span data-bind="text: BoardName"></span></td>

这只会在填充适配器时绑定(bind)到 BoardName 属性

<td data-bind="if: Adapter"><span data-bind="text: BoardName"></span></td>

当适配器有值时,这只会评估内部跨度的数据绑定(bind)。

关于javascript - 从 Breeze/knockout 中删除会产生 "Cannot read property ' BoardName' of null",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23900414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com