我与联结表有多对多的关系。
public class Contact
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ContactContactGroup> ContactContactGroups { get; set; }
}
public class ContactContactGroup
{
public int Id { get; set; }
public int ContactId { get; set; }
public int ContactGroupId { get; set; }
public virtual Contact Contact { get; set; }
public virtual ContactGroup ContactGroup { get; set; }
}
public class ContactGroup
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ContactContactGroup> ContactContactGroups { get; set; }
}
如果删除关系,我会收到以下异常:
Uncaught TypeError: Unable to parse bindings.
Bindings value: text: Contact().Name
Message: Cannot read property 'Name' of null
这是我的删除功能:
that.deleteMe = function (contactContactGroup) {
// Doesn't work also, duplicates entries after second deletion
//contactGroup.ContactContactGroups.remove(contactContactGroup);
contactContactGroup.entityAspect.setDeleted();
};
这是视图:
<div data-bind="foreach: ContactContactGroups">
<div data-bind="text: Contact().Name"></div>
<button data-bind="click: deleteMe">Delete</button>
</div>
我找到了一个与knockoutjs的'with'绑定的解决方法:
that.deleteMe = function (contactContactGroup) {
contactGroup.ContactContactGroups.remove(contactContactGroup);
contactContactGroup.entityAspect.setDeleted();
};
<div data-bind="foreach: ContactContactGroups">
<div data-bind="with: Contact">
<div data-bind="text: Name"></div>
</div>
<button data-bind="click: deleteMe">Delete</button>
</div>
但这对我来说似乎有些奇怪。 这是一个breezejs bug还是我错过了什么?
答案 0 :(得分:1)
该错误是什么? Knockout需要绑定对象,当您删除该对象的属性时,您将破坏绑定。
如果您使用的是联结表,但只是在执行自定义保存之前“删除”了一侧,听起来您在逻辑中发现了问题。而不是从contactGroup中删除ContactContactGroup,为什么不在删除之前将绑定的两边都设置为null,以便视图(可能)没有理由绑定到它?
that.deleteMe = function (contactContactGroup) {
contactContactGroup.Contact(null);
contactContactGroup.ContactGroup(null);
contactContactGroup.entityAspect.setDeleted();
entityManager.saveChanges();
};
修改强>
看起来问题是由于您绑定的方法,您在视图中显示联结表而不是显示两个属性之间的关系。问题仍然存在于Knockout中,并且无法显示已删除的绑定。您正在尝试执行的更简写版本将解决您遇到的问题......
<div data-bind="foreach: ContactContactGroups">
<div data-bind="text: $data.Contact().Name"></div>
<button data-bind="click: deleteMe">Delete</button>
</div>