c# - 从 observableArray 中删除元素

标签 c# javascript knockout.js entity-framework-5 breeze

我有一个在客户端使用 durandal、knockout.js 和 breeze 的 ASP.NET MVC 应用程序。我有一个问题,我反复遇到,但我没有在任何地方找到任何提及它的地方。不确定我是否让自己陷入了一个独特的境地,或者我只是没有找到正确的方法。

我需要知道如何从 observableArray 中删除 Breeze 实体,以便提交成功(参见下面的选项 A)并且 UI 反射(reflect)更改(参见下面的选项 B)。

我有以下模型(缩写):

public class Donor
{
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public virtual IList<Contact> Contacts { get; set; }
}

public class Contact
{
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [ForeignKey("Donor")]
    public int? DonorId { get; set; }
    public virutal Donor Donor { get; set; }
}

我正在尝试删除捐赠者的联系人。我很难在 Breeze 和 Knockout 之间获得正确的流程,因此该项目既可以从 observableArray 中删除(带有通知),也可以通过 Breeze 删除。

这是我尝试过的(javascript):

选项 A:

function deleteContact(contact){
    viewModel.donor().contacts.remove(contact);
    contact.entityAspect.setDeleted();
    viewModel.uow.commit();
}

当我使用这种方法时,我从 Breeze.WebApi 收到以下错误:

Int32Converter cannot convert from System.Int64

我查看了堆栈,并检查了 Breeze 源代码(虽然我还没有配置解决方案来逐步执行它),错误来自 Breeze.WebApi.EFContextProvider::RestoreOriginal,它在哪里将原始属性值恢复到对象。我不知道为什么它认为我的值是 Int64,但我找不到好的解决方法,所以我尝试了...

选项 B:

function deleteContact(contact){
    contact.entityAspect.setDeleted();
    viewModel.uow.commit();
}

这种方法使我能够成功保存删除(因为该项目尚未从集合中手动删除,因此没有任何“原始值”)。但是,这里的问题是 setDeleted 有效地从 observableArray 中删除了项目,没有通知我的删除绑定(bind)数组已经更改。所以该项目已被移除和删除,但我的用户界面仍然显示该项目。以后尝试调用 donor().contacts.remove(contact) 是徒劳的,因为 observableArray 不再有该项目。

最佳答案

您是否尝试过在使用选项 b 后在您的可观察数组上调用 valueHasMutated()

这将通知订阅者可观察对象已更改。

关于c# - 从 observableArray 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18730473/

相关文章:

javascript - KnockoutJS - 扩展购物车示例

c# - 仅在设置断点时创建 Unique Key,否则复制 key

c# - WeakEventManager 持有对订阅者的引用

javascript - HTML:监听输入的*所有*变化,而不仅仅是键盘驱动的变化?

javascript - css 难以改变 div 的宽度

jquery - 如何使用knockout.js将数据动态绑定(bind)到下拉列表?

c# - 在 protobuf-net 中,是否可以部分反序列化基于基本类型的消息

c# - SQL Server 的 NHibernate 超时

javascript - 如果存在则单击按钮,否则单击 puppeteer 中的不同按钮

knockout.js - knockout js中的多个数据绑定(bind)