うーん。私には間違っているようです。これを行う簡単なクエリがあります:
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): </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,…}