observablearray中的Breeze子实体不被创建为“dependentobservable”

时间:2013-01-29 21:30:38

标签: knockout.js breeze

嗯。对我来说似乎不对。我有一个轻微的查询来执行此操作:

             var query = new breeze.EntityQuery()
                     .from("AllGames")
                     .expand("Sets, MVP, TeamerMVP.Person")
                     .orderBy("GameDateTime desc");

(每个游戏可能没有或很多TeamerMVP记录,并且与person表存在一对一的关系,因此TeamerMVP.Person的扩展声明因此我可以直接访问" Name"属性这对于直接的一对一相关MVP(其中每场只能有一个)非常有效。

一切似乎都很好 - 相关实体已加载,我也可以访问原型函数中的子实体。但是,我试图在与子实体的html绑定中做很多事情时遇到问题,并且在检查chrome的控制台时,看起来可能是因为与父级不同的子实体未被声明为dependentobservable,它们是只是简单的"对象"。

viewmodel defines parent as:           games = ko.observableArray([])

在控制台中进行评估:

$data
    Object
        games: Object[0]
        _latestValue: Array[7]
        0: Game
        1: Game
        2: Game
            >GameDateTime: function dependentObservable() {
            >HomeGame: function dependentObservable() {
            >ID: function dependentObservable() {
            >LeagueGame: function dependentObservable() {
            >MVP: function dependentObservable() {
            >MVP_PersonID: function dependentObservable() {
            >NLorRL: "<strong>NL</strong> (A)"
            >Opponent: function dependentObservable() {
            >Sets: Object[0]
            >TeamerMVP: Object[0]

在展开的节点中,您可以看到父实体级属性(GameDateTime,HomeGame等)被创建为dependentobservables,但子实体(Sets,TeamerMVP)不是,我猜这就是为什么我在html模板绑定方面遇到了一些问题,例如&#34; foreach&#34;因为淘汰赛似乎并没有看到那些儿童实体。

我有什么遗失的东西吗?我应该创建一个&#34; games.Sets = ko.observableArray([])&#34; viewmodel中的声明在创建时用作子实体的容器?

返回的json数据显示以下内容:

TeamerMVP: [{$id:20, $type:lbD.model.TeamerMVP, lbD.model, GameID:3, PersonID:4,…}]
    0: {$id:20, $type:lbD.model.TeamerMVP, lbD.model, GameID:3, PersonID:4,…}
    $id: "20"
    $type: "lbD.model.TeamerMVP, lbD.model"
    GameID: 3
    Person: {$id:21, $type:lbD.model.Person, lbD.model, ID:4, Name:Mike Connor, isAdmin:false,…}
    PersonID: 4

很容易看到&#34;姓名&#34;相关人员表中的财产。

编辑添加: 它只是&#34; TeamerMVP&#34;这种关系很麻烦。只是设法用&#34; forEach&#34;在&#34;集&#34;实体,以便工作正常,即使它不是一个依赖的可观察......我很困惑。

进一步编辑了沃德的问题:

根据要求在断点处看到列出的这些:

breezeConfig.manager.metadataStore._structuralTypeMap
Object
  >Game:#lbD.model: ctor
  >GameSet:#lbD.model: ctor
  >Person:#lbD.model: ctor
  >TeamerMVP:#lbD.model: ctor
  >Venue:#lbD.model: ctor
  >__proto__: Object

这些是我(简单)数据库中的具体表名。如果我扩展&#34; GameSet&#34;然后其中一个属性是:defaultResourceName:&#34; Sets&#34;这是导航属性名称(在模型中定义为&#34; Public Overridable Property Sets()As ICollection(Of GameSet)&#34;)。

啊......刚刚扩大了#34; TeamerMVP&#34;它的defaultresourcename是&#34; TeamerMVPs&#34;这是一个小但微妙的差异!我不记得用&#34; s&#34;来定义一个版本。在任何地方的最后,快速搜索项目显示没有结果。好奇。也许这就是问题,我现在可以快速使用html绑定。

编辑3:HTML绑定信息

不,不打球......

我有这个模板:

 <script type="text/html" id="TeamerMVPTemplate">
    <div>Teamer MVP(s):&nbsp;</div>
    <li data-bind="text: Person().Name"></li>
</script>

其中嵌入了另一个模板(主要&#34; foreach:游戏&#34;一个),它是引用它的地方:

<span class="fixtureBoxLine" data-bind="template: { name: 'setScoresTemplate', foreach: Sets }"></span>
<span class="fixtureBoxLine" data-bind="template: { name: 'TeamerMVPTemplate', foreach: TeamerMVPs }"></span>

......它只是默默地打破了。没有错误消息,但处理在第一个游戏的第一个循环停止。 &#34; foreach:集&#34;紧靠其上方的模板非常有效。

如果我改变&#34; foreach:TeamerMVPs&#34;回到&#34; foreach:TeamerMVP&#34;在上面的绑定声明中,所有游戏都被处理,但TeamerMVP的模板中没有显示任何内容,所以我想&#34; TeamerMVPs&#34;是正确的实体参考,我试图访问它的方式有些奇怪。是&#34;人()。姓名&#34;模板中的正确绑定?

===========================================

编辑4:澄清模型

manager.metadataStore.getEntityType(&#39; Game&#39;)。navigationProperties返回4个导航属性。这是正确的,应该有一个0到多的集合&#34;集&#34;,0到多的集合&#34; TeamerMVP&#34;,0到1&#34; MVP&#34;并且0到1&#34; Venue&#34;。一切都在场。

只有一个(或没有)MVP,但是对于0到多个TeamerMVP来说是完全正确的。这种关系的设置方式与&#34; Set&#34;完全相同。有效的关系。唯一的细微差别是&#34; TeamerMVP&#34; tavle本身与&#34; Person&#34;有一对一的关系。任何TeamerMVP必须是一个有效的人。这就是为什么我的breeze查询定义了一个&#34; expand&#34;指的是&#34; TeamerMVP.Person&#34;这似乎工作,因为返回的json数据正如我所期望的那样。在原始json中,导航属性被称为&#34; TeamerMVP&#34;它只存在于&#34; structuraltypemap&#34; defaultResourceName被称为&#34; TeamerMVPs&#34;。

如果我将html绑定保留为&#34;对于每个TeamerMVP&#34;然后所有游戏都返回并绑定到&#34; foreach游戏&#34;父模板按预期方式,但没有数据绑定到TeamerMVP模板,并且控制台中不显示任何错误。如果我将绑定更改为&#34; foreach TeamerMVP&#34;然后只返回一个游戏,然后处理在绑定发生并且将显示数据的点停止。但是,控制台中没有显示错误。

似乎breeze正在创建导航属性,因为&#34; TeamerMVPs&#34;内部但json正在回归&#34; TeamerMVP&#34;也许这种差异是为什么绑定似乎有效但却没有绑定数据的原因?它目前超越了我的理解力!

=============================================== ==================

编辑5:添加模型信息

游戏模型

Public Class Game
    Public Property ID() As Integer
    Public Property GameDateTime() As System.DateTime
    Public Property Opponent() As String
    Public Property HomeGame() As Boolean
    Public Property LeagueGame() As Boolean
    Public Property MVP_PersonID() As Nullable(Of Integer)
    Public Property VenueID() As Nullable(Of Integer)
    Public Property isNL() As Boolean

    Public Overridable Property Sets() As ICollection(Of GameSet)
    Public Overridable Property MVP() As Person
    Public Overridable Property TeamerMVP() As ICollection(Of TeamerMVP)
    Public Overridable Property Venue() As Venue
End Class

TeamerMVP模型

Public Class TeamerMVP
    Public Property GameID() As Integer
    Public Property PersonID() As Integer

    Public Overridable Property Person() As Person
End Class

人物模型

Public Class Person
    Public Property ID() As Integer
    Public Property Name() As String
    Public Property isAdmin() As Boolean
    Public Property email() As String
    Public Property type() As String
    Public Property Image() As String
    Public Property thumbImage() As String
    Public Property backImage1() As String
    Public Property backImage2 As String
    Public Property Height() As String
    Public Property YearStarted() As String
    Public Property Position() As String
    Public Property PreviousClubs() As String
    Public Property ShirtNumber() As String
    Public Property isNL() As Boolean

    Public Overridable Property Games_MVP() As ICollection(Of Game)
    Public Overridable Property Games_TeamerMVP() As ICollection(Of Game)
End Class

GameSet模型

Public Class GameSet
    Public Property ID() As Integer
    Public Property GameID() As Integer
    Public Property SetNo() As Integer
    Public Property ourScore() As Integer
    Public Property theirScore() As Integer

    Public Overridable Property Game() As Game
End Class

在成功断点处在控制台中使用breezeConfig.manager.getEntities('TeamerMVP')确实揭示了整个负载#34; TeamerMVP&#34;实体。网络资源选项卡显示&#34; TeamerMVP&#34;正确的相关实体。在原始返回数据中也是如此。

但是,在成功断点处在控制台中运行data.results[0].TeamerMVP()仍然不会返回任何内容:

data.results[0].TeamerMVP()
>[]
data.results[2].TeamerMVP()
>[]

上面的第一个是正确的,第一个返回的游戏没有关联的#34; TeamerMVP&#34;实体尚未实现,但序列中的第3个游戏确实具有关联的权限,如返回的原始json数据所示:

TeamerMVP: [{$id:4, $type:lbD.model.TeamerMVP, lbD.model, GameID:24, PersonID:14,…},…]
 >0: {$id:4, $type:lbD.model.TeamerMVP, lbD.model, GameID:24, PersonID:14,…}
 >1: {$id:6, $type:lbD.model.TeamerMVP, lbD.model, GameID:24, PersonID:15,…}

1 个答案:

答案 0 :(得分:1)

最终更新

哇,我能说什么,但非常感谢Ideablade的Ward花了这么多时间来帮助解决这个问题。事实证明,最终是最简单的事情:从依赖的“TeamerMVP”到父母“游戏”的遗漏返回导航属性。

所以我所要做的就是改变TeamerMVP模型:

Public Class TeamerMVP
    Public Property GameID() As Integer
    Public Property PersonID() As Integer

    Public Overridable Property Person() As Person
End Class

要:

Public Class TeamerMVP
    Public Property GameID() As Integer
    Public Property PersonID() As Integer

    Public Overridable Property Game() As Game
    Public Overridable Property Person() As Person
End Class

......所有这一切都立刻变为现实,TeamerMVP实体出现在应有的位置。

Ward和他在Ideablade的同事正在研究如果可能的话突出/捕捉这种情况的任何可能性。如果你是作为初学者阅读这个问题/试图了解更多有关Breeze的信息,那么我只能鼓励你全力以赴,因为这是一个了不起的产品,我只是简单地描述了它可以做到的事情远。最重要的是,它背后有一支伟大的团队。谢谢沃德!