かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

LightSwitch(HTML Client)のVisual Collection覚書

リファレンス的なドキュメントってどこにあるんでしょう…LightSwitchのJavaScriptライブラリ達。(コードがドキュメント?)
とまぁいきなり愚痴ですが、ちょいちょいとLightSwitchのHTML Clientを触ってみてます。こいつは、なかなかデキルやつでレスポンシブでタッチフレンドリーなUIをさくさくと作れる優れもの。JavaScriptを要所要所で書くことが出来るので、その気になればダサいテーブルとかも自分で組み込むことが出来ちゃう。つまり細部まで知ったうえで使えば、簡単なアプリ作りをするうえでの心強い味方になってくれる可能性が無きにしも非ずな可能性を感じます。

ということで、今日の本題。

JavaScriptのVisualCollection覚書

色々試してて、データを読み込んだりするのに使ったメソッドとかです。

VisualCollectionの取得方法

ページにProductsというクエリやテーブルを作ってる場合は、以下のようなJavaScriptで取得できる。

var collection = screen.Products;

その他に、Productsをレンダリングするカスタムコントロールの場合は、関数の引数のcontentItemのvalueがProductsのVisualCollectionになってる

myapp.BrowseProducts.ProductsItem_render = function (element, contentItem) {
  var collection = contentItem.value; // これで取得できる
}
読み込み完了かどうかの判定と読み込み

isLoadedプロパティで読み込み完了かどうか確認できる。falseの場合はloadメソッドを使ってデータの読み込みを行う。

var collection = contentItem.value;
// renderRowsというデータを描画する関数があるとする
function isLoadedChanged() { renderRows(collection.data); }
if (collection.isLoaded) {
    // 読み込み済みならレンダリングする
    renderRows(collection.data);
} else {
    // 読み込み済みじゃないならisLoadedにイベントハンドラしかけて、loadを呼ぶ
    collection.addChangeListener('isLoaded', isLoadedChanged);
    collection.load();
}
実際に読み込まれてるデータを取得する

上の例でも出てますがdataで取得できます。

var collection = contentItem.value;
// 読み込み済みデータを取得(配列になってる)
var items = collection.data;
続きを読み込む

canLoadMoreプロパティで、まだ続きのデータを読み込めるか判定して、読み込めるようならloadMoreメソッドで読み込みを行う。loadMoreメソッドはPromiseを返すのでthenとかで繋げて読み込み完了時の処理とかが書ける。

// まだ続きがあるか確認
if (screen.Products.canLoadMore) {
    // 続きがあるならloadMoreで読み込む。
    screen.Products.loadMore().then(function (result) {
        // 読み込み結果はitemsで取得できる
        renderRows(result.items);
    });
}
選択中のアイテムを取得

selectedItemプロパティで取得・設定可能。

// 選択中のアイテムを取得
var item = screen.Products.selectedItem;