我有一个包含我试图绑定到我的视图模型的 koGrid 的 Durandal 小部件(热毛巾模板)。
我对这些技术很陌生,包括异步延迟和承诺,所以请原谅我对这些问题的无知!
视图模型从 datacontext 类中获取数据,该类仅返回 Breeze 实体管理器查询的结果(返回 Q 承诺):
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 未定义的问题。
非常感谢任何帮助!