1

シングルページアプリケーションにBreezeデータサービス(別名datacontext)があります。各実行のOutlineItemsのリストとともに、WebAPIコントローラーから実行のリストを取得したいと思います。

コントローラは、BreezeControllerでこのメソッドを使用して子OutlineItemsを使用して開いている実行のリストを返します。

[AcceptVerbs("GET")]
public IQueryable<Run> Runs()
{
return _contextProvider.Context.Runs
    .Include("RunOutlineItems")
    .AsQueryable()
    .Where(r => r.RunStatusId < 4);    // 4 is the cutoff for open items             

}

これがデータモデルです。

namespace PilotPlantBreeze
{
    public class Run
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Rundate { get; set; }
        public DateTime? RunStart { get; set; }
        public int MachineId { get; set; }
        public int ProductId { get; set; }
        public int RunStatusId { get; set; }
        public string Comments { get; set; }

        // Nav props
        public IList<OutlineItem> RunOutlineItems { get; set; }
    }
}       

WebAPIリクエストからの応答データを見ると、RunOutlineItemsのリストはJSONにあります。たとえば、次の1つの項目があります。

{
    "$id":"27",
    "$type":"PilotPlantBreeze.OutlineItem,PilotPlantBreeze.Model",
    "Id":22,
    "RunId":5,
    "TankId":4,
    "OutlineTopicId":1,
    "OutlineDescriptionId":9,
    "PersonId":1,
    "Value":"23"
}

これは、WebAPIからデータを取得するためのクライアント側のJavaScriptコードです。わかりやすくするために、エラーチェックとローカルキャッシュチェックは省略されています。

var getRuns = function () {
    // The EntityQuery is defined at the beginning of the dataservice
    //  Here I am asking for a query on the server.  Note the .expand 
    //  which is supposed to avoid lazy loading.  Lazy loading is turned off 
    //  on the WebAPI already.
    var query = EntityQuery
    .from("Runs")
    .expand("RunOutlineItems")
    .orderBy("rundate");

    // The manager is defined at the beginning of the dataservice
    //  Here I am asking the manager to execute the query with a promise
    return manager.executeQuery(query)
    .then(runsQuerySucceeded)
    .fail(runsQueryFailed);

    // The promise does not fail, but I would put an error in here if it ever does
    function runsQueryFailed(data) {
    }
    // When the promise succeeds, the data parameter is the JSON from the WebAPI
    function runsQuerySucceeded(data) {
        //
        // When I stop the debugger here data.results holds the entities, but
        //  the child entities for the RunOutlineItems is an observableArray with 
        //  nothing in it.
        //
        app.vm.runs.runs(data.results);
    }
};

したがって、私の質問は、子アイテムをviewModelに取り込む方法です。サーバー上のWebAPIへの個別の呼び出しで子アイテムを取得し、カスタムko.bindHandlerで処理する回避策がありますが、ナビゲーションテクノロジを機能させると便利です。

4

1 に答える 1

2

'include' (サーバー側) と expand (クライアント側) の両方は必要ありません。どちらかがトリックを行う必要があります。

したがって、クライアント側のクエリはそのままにして、サーバー側のクエリを次のように変更します。

[AcceptVerbs("GET")]
public IQueryable<Run> Runs() {
    return _contextProvider.Context.Runs
      .Where(r => r.RunStatusId < 4);    // 4 is the cutoff for open items             

}

AsQueryable() もなくなっていることに注意してください。

これがうまくいかない場合は、投稿してください。

于 2012-12-19T00:12:08.590 に答える