处理breezejs中的引用

时间:2012-11-28 07:36:02

标签: json reference knockout.js breeze

我们正在使用ASP.NET MVC4开发单页应用程序,使用Web Api + Ko + Breeze,使用EF Code First。

我们的(简化)数据模型看起来像这样

class Product {
    public String Name { get; set; }
    public ICollection<ImageCollection> ImageSets { get; set;}
    public Image DefaultImage { get; set; }
}

class ImageCollection {
    public ICollection<Image> Images { get; set; }
}

class Image {
    public String ImageUrl { get; set; }
}

DefaultImage是一个导航属性(带有外键),是ImageSet中的一个图像。

我们正在公开Products()的Web API方法,并使用默认的Breeze配置。线上的JSON序列化输出具有对象的引用(即PreserveReferencesHandling.Object),因此当我想绑定ImageUrl时,ko无法解析该值。

Html看起来像这样

 <img data-bind="attr: { src: DefaultImage().ImageUrl, title: Name}" />

当我切换序列化程序以执行PreserveReferencesHandling.None时,绑定有效。

问题:如何使默认配置生效?或者如果我为Breeze切换到PreserveReferencesHandling.None有什么问题/缺点?

谢谢!

1 个答案:

答案 0 :(得分:2)

通常,您不希望将PreserveReferencesHandling切换为None,因为您将无法序列化循环引用,并且您的有效负载将变得更大。

我实际上并不理解为什么绑定会在设置之后开始起作用。理解这一点的第一步可能是在查询后检查ko对象是否实际包含正确的数据。

请记住,breeze导航属性是延迟加载的,因此您可能没有使用初始查询加载它们。看一下“EntityAspect.loadNavigationProperty”方法。