0

我与联结表有多对多的关系。

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>

但这对我来说似乎有点奇怪。这是一个微风的错误还是我错过了什么?

4

1 回答 1

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>
于 2013-08-15T18:32:09.567 回答