0

Knockout.js 2.2.1 と Breeze 1.3.5 を使用して一部のデータを取得して表示していますが、結果はかなり異なります。データは、自己参照テーブルから取得されます。私が知る限り、Knockout は、各アイテムのChildrenプロパティは、アイテムの実際の子ではなく、配列全体を返す必要があると考えているようです。私は何を間違っていますか?

更新 1 :フィドルを作成し、期待どおりの結果が得られましたが、breeze.js を使用していません。おそらくこれは、breast.js の問題でしょうか? フィドルで注目すべき点は、ChildrenNameの両方が括弧なしで参照されているのに対し、私の完全なアプリケーションでは、breeze.js がそれらを適切な observables* に変換し、Nameに括弧を必要とするように見えることです。

現在の結果:

Apparel
- Apparel
Art
- Art
Books
- Books
Movies
- Movies
test
- test
Blu-ray
- Blu-ray
DVD
- DVD
Animation
- Animation
Accessories
- Accessories

期待される結果:

Apparel
- Accessories
Art
- Animation
Books
Movies
- Blu-ray
- DVD
test

仮想マシン:

var vm = {
    categories: ko.observableArray()
};

Knockout.js マークアップ:

<div data-bind="foreach: categories">
    <div data-bind="text: Name"></div>
    <div data-bind="foreach: Children">
        <div data-bind="text: ' - ' + Name()"></div>
    </div>
</div>

微風コード:

var query = breeze.EntityQuery.from("Category")
    .orderBy("ParentCategoryId, Name")
    .expand("Children");

_entityManager
    .executeQuery(query)
    .then(function (data) {
        vm.categories.removeAll();
        console.log("here: " + data.results.length); -- produces 9
        data.results.forEach(function (item) {
            vm.categories.push(item);
        });
    })
    .fail(function (error) { console.log("Error: " + error); });

Breeze クエリ結果:

[ { "$id" : "1",
    "$type" : "SR.Data.Models.Domain.Category, SR.Data",
    "CategoryId" : 5,
    "Children" : [ { "$id" : "2",
          "$type" : "SR.Data.Models.Domain.Category, SR.Data",
          "CategoryId" : 6,
          "Children" : [  ],
          "CreatedOn" : "2013-05-31T11:29:11.860",
          "Description" : "Accessories",
          "IsDeleted" : false,
          "IsPublished" : true,
          "Name" : "Accessories",
          "ParentCategory" : { "$ref" : "1" },
          "ParentCategoryId" : 5
        } ],
    "CreatedOn" : "2013-05-31T11:28:37.677",
    "Description" : "Apperal",
    "IsDeleted" : false,
    "IsPublished" : true,
    "Name" : "Apparel"
  },
  { "$id" : "3",
    "$type" : "SR.Data.Models.Domain.Category, SR.Data",
    "CategoryId" : 3,
    "Children" : [ { "$id" : "4",
          "$type" : "SR.Data.Models.Domain.Category, SR.Data",
          "CategoryId" : 4,
          "Children" : [  ],
          "CreatedOn" : "2013-05-31T11:25:46.333",
          "Description" : "Animation",
          "IsDeleted" : false,
          "IsPublished" : true,
          "Name" : "Animation",
          "ParentCategory" : { "$ref" : "3" },
          "ParentCategoryId" : 3
        } ],
    "CreatedOn" : "2013-05-31T11:25:30.250",
    "Description" : "Art",
    "IsDeleted" : false,
    "IsPublished" : true,
    "Name" : "Art"
  },
  { "$id" : "5",
    "$type" : "SR.Data.Models.Domain.Category, SR.Data",
    "CategoryId" : 1,
    "Children" : [  ],
    "CreatedOn" : "2013-05-13T17:14:15.880",
    "Description" : "Books",
    "IsDeleted" : false,
    "IsPublished" : true,
    "Name" : "Books"
  },
  { "$id" : "6",
    "$type" : "SR.Data.Models.Domain.Category, SR.Data",
    "CategoryId" : 2,
    "Children" : [ { "$id" : "7",
          "$type" : "SR.Data.Models.Domain.Category, SR.Data",
          "CategoryId" : 7,
          "Children" : [  ],
          "CreatedOn" : "2013-05-31T11:31:05.710",
          "Description" : "Blu-ray",
          "IsDeleted" : false,
          "IsPublished" : true,
          "Name" : "Blu-ray",
          "ParentCategory" : { "$ref" : "6" },
          "ParentCategoryId" : 2
        },
        { "$id" : "8",
          "$type" : "SR.Data.Models.Domain.Category, SR.Data",
          "CategoryId" : 8,
          "Children" : [  ],
          "CreatedOn" : "2013-05-31T11:31:15.000",
          "Description" : "DVD",
          "IsDeleted" : false,
          "IsPublished" : true,
          "Name" : "DVD",
          "ParentCategory" : { "$ref" : "6" },
          "ParentCategoryId" : 2
        }
      ],
    "CreatedOn" : "2013-05-14T12:13:36.570",
    "Description" : "DVD's & Blu-ray",
    "IsDeleted" : false,
    "IsPublished" : true,
    "Name" : "Movies"
  },
  { "$id" : "9",
    "$type" : "SR.Data.Models.Domain.Category, SR.Data",
    "CategoryId" : 11,
    "Children" : [  ],
    "CreatedOn" : "2013-06-03T15:32:50.023",
    "Description" : "test",
    "IsDeleted" : false,
    "IsPublished" : true,
    "Name" : "test"
  },
  { "$ref" : "7" },
  { "$ref" : "8" },
  { "$ref" : "4" },
  { "$ref" : "2" }
]

カテゴリ エンティティ:

public class Category
{
    public Category() { }

    public virtual int CategoryId { get; set; }

    public virtual int? ParentCategoryId { get; set; }

    public virtual int? PictureId { get; set; }

    public virtual string Name { get; set; }

    public virtual string Description { get; set; }

    public virtual bool IsPublished { get; set; }

    public virtual bool IsDeleted { get; set; }

    public virtual DateTime CreatedOn { get; set; }

    public virtual Category ParentCategory { get; set; }

    public virtual Picture Picture { get; set; }

    public virtual ICollection<Category> Children { get; set; }
}

カテゴリ マッピング:

modelBuilder.Entity<Category>().HasKey(a => a.CategoryId);
modelBuilder.Entity<Category>().HasOptional(x => x.Picture).WithMany().HasForeignKey(x => x.PictureId);
modelBuilder.Entity<Category>().HasOptional(x => x.ParentCategory).WithMany().HasForeignKey(x => x.ParentCategoryId);
modelBuilder.Entity<Category>().HasMany(x => x.Children).WithOptional().HasForeignKey(x => x.ParentCategoryId);

カテゴリ表:

カテゴリー表

4

2 に答える 2

0

わかりません。マークアップ エラー(以下)を除いて、基本的には正しいように見えます。JSON があると便利ですが、クエリが完了した後、Category エンティティが実際に何を持っているかわかりません。

次のステップに進む前に、マークアップを修正するとどうなるでしょうか?

マークアップの間違い

子テンプレートの「名前」の後の括弧は必要ありません。そのはず

<div data-bind="text: ' - ' + Name"></div> <!-- 名前の後に括弧はありません -->

それはあなたのフィドルにあります。

よりクリーンな成功のコールバック

ここにいる間に、内側の配列をクエリ結果の配列に置き換えるだけの代替構文を検討することもできます。反復は必要ありません。

.then(関数 (データ) {
        vm.categories(データ.結果);
        console.log("ここ: " + data.results.length); -- 9 を生成します
        });
    }))
于 2013-06-08T07:20:17.210 に答える