0

うーん。私には間違っているようです。これを行う簡単なクエリがあります:

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

(ゲームごとに TeamerMVP レコードが存在しない場合も多く存在する場合もあり、person テーブルとは 1 対 1 の関係があるため、TeamerMVP.Person の expand ステートメントを使用して、"Name" プロパティに直接アクセスできます。これは、直接 1 対 1 で関連する MVP (ゲームごとに 1 つのみ)

すべて問題ないようです-関連するエンティティがロードされ、プロトタイプ関数の子エンティティにも問題なくアクセスできます。ただし、子エンティティを使用してhtmlバインディング内で多くのことを行おうとすると問題が発生し、クロムのコンソールで確認すると、親とは異なり、子エンティティが依存監視可能として宣言されていないため、単に「オブジェクト"。

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 など) が依存オブザーバブルとして作成されていることがわかりますが、子エンティティ (セット、TeamerMVP) は作成されていません。ノックアウトとして「foreach」のようなことを行うhtmlテンプレートバインディングの問題は、単にそれらの子エンティティを認識していないようです。

足りないものはありますか?ビューモデルで「games.Sets = ko.observableArray([])」宣言を作成して、作成時に子エンティティのコンテナーとして機能する必要がありますか?

返される 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

関連する Person テーブル内の "Name" プロパティを簡単に確認できます。

追加するように編集: 面倒なのは「TeamerMVP」の関係だけです。「Sets」エンティティで「forEach」を使用して何かを行うことができたので、依存するオブザーバブルではありませんが、うまく機能しています....私は困惑しています。

Wardの質問のためにさらに編集されました:

要求されたブレークポイントで、次のリストが表示されます。

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

これらは、私の(単純な)データベースからの具体的なテーブル名です。「GameSet」を展開すると、プロパティの 1 つが次のようになります。

ああ... "TeamerMVP" を拡張したところ、そのデフォルトのリソース名は "TeamerMVPs" です。これは小さいながらも微妙な違いです! 末尾に「s」が付いたバージョンを定義したことをどこにも思い出せず、プロジェクトをすばやく検索しても結果が見つかりません。奇妙。それが問題なのかもしれません。ここで、HTML バインディングを簡単に試してみましょう。

編集 3: HTML バインディング情報

いいえ、まったくボール遊びをしていません...

私はこのテンプレートを持っています:

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

これは別のテンプレート (メインの「foreach: games」テンプレート) に埋め込まれており、ここで参照されます。

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

...そして、静かに壊れます。エラー メッセージは表示されませんが、最初のゲームの最初のループで処理が停止します。そのすぐ上の「foreach: Sets」テンプレートは完全に機能します。

上記のバインディング宣言で「foreach: TeamerMVPs」を「foreach: TeamerMVP」に戻すと、すべてのゲームが処理されますが、TeamerMVP のテンプレートには何も表示されないため、「TeamerMVPs」が正しいエンティティ参照であり、奇妙なことが起こっていると思います。私がそれにアクセスしようとしている方法で。"Person().Name" はテンプレートの正しいバインドですか?

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

編集 4: モデルの明確化

manager.metadataStore.getEntityType('Game').navigationProperties は 4 つのナビゲーション プロパティを返します。これは正しいです。0 から多数の「セット」のコレクション、0 から多数の「TeamerMVP」のコレクション、0 から 1 の「MVP」、および 0 から 1 の「会場」が必要です。すべてが存在します。

MVP は 1 つだけ (またはなし) にすることができますが、0 から多数の TeamerMVP が存在することは完全に正しいことです。この関係は、機能する「セット」関係とまったく同じ方法で設定されます。唯一のわずかな違いは、TeamerMVP は有効な人物でなければならないため、「TeamerMVP」テーブル自体が「Person」テーブルと 1 対 1 の関係を持っていることです。これが、私の簡単なクエリが「TeamerMVP.Person」を参照する「expand」を定義する理由であり、返された json データが期待どおりであるため、これは機能しているように見えます。raw json では、ナビゲーション プロパティは「TeamerMVP」と呼ばれ、defaultResourceName が「TeamerMVPs」と呼ばれるのは「structuraltypemap」のみです。

HTML バインディングを「forEach TeamerMVP」のままにすると、すべてのゲームが返され、期待どおり「foreach games」親テンプレートにバインドされますが、データは TeamerMVP テンプレートにバインドされず、コンソールにエラーは表示されません。バインディングを「foreach TeamerMVPs」に変更すると、1 つのゲームのみが返され、バインディングが発生してデータが表示される時点で処理が停止します。ただし、コンソールにエラーは表示されません。

そよ風が内部でナビゲーション プロパティを「TeamerMVPs」として作成しているように見えますが、json は「TeamerMVP」を返しています。おそらくその不一致が、バインディングが機能しているように見えるのにデータがバインドされていない理由ですか? 今の私の理解をはるかに超えています!

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

編集 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

ゲームセット モデル

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')すると、実際に「TeamerMVP」エンティティの全負荷が明らかになります。ネットワーク リソース タブには、未加工の返されたデータでも「TeamerMVP」の正しい関連エンティティが表示されます。

ただし、data.results[0].TeamerMVP()成功ブレークポイントでコンソールで実行しても何も返されません。

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

上記の最初のものは正しく、最初に返されたゲームには関連付けられた「TeamerMVP」エンティティがまだありませんが、シーケンスの 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,…}
4

1 に答える 1

1

最終更新

うわー、この問題の解決に多くの時間を割いてくれた Ideablade の Ward に心から感謝します。最終的には、最も単純なものであることが判明しました。依存する「TeamerMVP」から親の「Game」への戻りナビゲーション プロパティが欠落しています。

したがって、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 エンティティが本来あるべき場所に表示され、すべてがすぐに実現しました。

Ideablade の Ward と彼の同僚は、可能であれば、この状況を強調/トラップする可能性を検討しています。あなたが初心者としてこの質問を読んでいる/Breezeについてもっと知りたいと思っているなら、それは素晴らしい製品であり、私はそれができることの表面をかじっただけなので、完全に試してみることをお勧めします.遠い。最も重要なことは、その背後に素晴らしいチームがいるということです。ありがとうワード!

于 2013-02-25T08:47:58.653 に答える