我一直在使用简单干净的访问方式来删除从微风数据服务填充的表中的项目。一切正常,直到我开始在显示的表中包括导航属性。现在,每当使用删除功能时,都会出现错误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添加为表中的引用之前,我可以单击Delete按钮,一切正常。现在我得到一个错误。删除逻辑为:

var deleteSpecificAdapter = function (item) {
    item.entityAspect.setDeleted();
    specificAdapters.remove(item);
};


在运行item.entityAspect.setDeleted();时引发错误。将数据绑定添加到Adapter().BoardName是否会以无法充分映射回使用的方式更改item变量?我是否需要具有用于确定实际项目的不同逻辑,还是需要不同地绑定click事件,以便从foreach获取特定的,未重新映射的项目?

最佳答案

通过按您的方式绑定到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具有值时,才评估内部跨度的数据绑定。

10-04 15:31