ビュー モデルにバインドしようとしている koGrid を含むデュランダル ウィジェット (ホット タオル テンプレート) があります。
私は非同期遅延やプロミスを含むこれらのテクノロジーにかなり慣れていないので、そのような問題について無知であることを許してください!
ビュー モデルは、Breeze エンティティ マネージャー クエリ (Q promise を返す) の結果を返すだけの datacontext クラスからデータを取得します。
var manager = new breeze.EntityManager({ dataService: dataService });
return manager.executeQuery(query)
.then(function (data) {
return data.results;
})
.fail(queryFailed);
私のウィジェットのコンストラクターには、次のものがあります。
var vm = function(element, settings) {
var self = this;
this.settings = settings;
this.myData = ko.observableArray([]);
this.viewAttached = viewAttached;
queryDataContext.executeQuery('Customer', 'good').then(function(ents) {
var Item = function(id, name, maincontacttelephone) {
this.ID = id;
this.Name = name;
this.MainContactTelephone = maincontacttelephone;
};
for (var i = 0; i < ents.length; i++) {
self.myData.push(new Item(ents[i].ID(), ents[i].Name(), ents[i].MainContactTelephone()));
}
self.gridOptions = { data: self.myData };
});
};
return vm;
function viewAttached(view) {
$(window).trigger('resize');
return true;
}
データは「ents」変数に返され、observableArray myData にプッシュされます。これは機能するはずですが、koGrid ファイルでエラーが発生します。
/***********************************************
* FILE: ..\src\bindingHandlers\ko-grid.js
***********************************************/
ko.bindingHandlers['koGrid'] = (function () {
return {
'init': function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var options = valueAccessor();
valueAccessor() が定義されていないため、グリッドが機能しません。
ここで、リモート クエリを実行するコードを次のように変更すると:
$.when(queryDataContext.executeQuery('Customer', 'good')).then(function(ents) {
(jQueryを使用すると約束されます)、何らかの理由で機能します。ただし、ents 変数のタイプは「makePromise」であり、解決方法がわかりません。
私の理解では、とにかく Breeze が返すのは Q の約束です。
Q.when(queryDataContext.executeQuery('Customer', 'good')).then(function(ents) {
ents にはデータが含まれますが、koGrid の未定義の問題に戻ります。
どんな助けでも大歓迎です!