我有一个在客户端使用 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/