问题
我有6个下降的视图。每个都由Web API调用填充。我想要 从远程服务器填充后,使用breeze在本地运行查询
当数据调用针对服务器时,代码运行正常。问题是尝试查询本地缓存时。我再也没有得到任何结果。我的方法有缺陷还是我做错了什么?
服务器端
查看模型
class genericDropDown()
{
public int value{get;set;}
public string option{get;set;}
}
WebAPI [单一样本方法]
[HttpGet]
// GET api/<controller>
public object GetSomeVals()
{
return _context.getClinician();
}
存储库[单一样本方法]
public IEnumerable<genericDropDown> getDropDownVal()
{
return context.somemodel(a=>new{a.id,a.firstname,a.lastname}).ToList().
Select(x => new GenericDropDown
{ value = x.id, option = x.firstname+ " " + x.lastname});}
}
客户端
Datacontext.js
var _manager = new breeze.EntityManager("EndPoint");
//Being called from my view model
var getDropDownBindings = function(KO1, KO2) {
//First add the entity to the local metadatastore then populate the entity
$.when(
addDD('clinicianDropDown', webAPIMethod),
getData(KO1, webAPIMethod, null, 'clinicianDropDown'),
addDD('docTypeDropDown', webAPIMethod);
getData(KO2, webAPIMethod, null, 'docTypeDropDown'),
).then(querySucceeded).fail(queryFailed);
function querySucceeded(data) {
logger.log('Got drop down vals', "", 'dataContext', true);
}
};
//Add the entity to local store. First param is typename and second is
resource name (Web API method)
var addDD = function(shortName,resName) {
_manager.metadataStore.addEntityType({
shortName: shortName,
namespace: "Namespace",
autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
defaultResourceName:resName,
dataProperties: {
value: { dataType: DataType.Int32,
isNullable: false, isPartOfKey: true },
option: { dataType: DataType.String, isNullable: false }
}
});
return _manager.metadataStore.registerEntityTypeCtor(shortName, null, null);
};
//Get the data
var getData = function(observableArray, dataEndPoint, parameters, mapto) {
if (observableArray != null)
observableArray([]);
//TO DO: Incorporate logic for server or local call depending on
// whether this method is accessed for the first time
var query = breeze.EntityQuery.from(dataEndPoint);
if (mapto != null && mapto != "")
query = query.toType(mapto);
if (parameters != null)
query = query.withParameters(parameters);
//This approach doesnt work on local querying as Jquery complains
//there is no 'then' method. Not sure how to implement promises
//when querying locally
/* return _manager.executeQuery(query).then(querySucceeded).fail(queryFailed);
function querySucceeded(data) {
if (observableArray != null)
observableArray(data.results);
}
*/
//The array length from this query is always 0
var data = _manager.executeQueryLocally(query);
observableArray(data.results);
return;
};
//Generic error handler
function queryFailed(error) {
logger.log(error.message, null, 'dataContext', true);
}
viewmodel.js
//In Durandal's activate method populate the observable arrays
dataContext.getDropDownBindings (KO1,KO2);
Viewmodel.html
<select class="dropdown" data-bind="options: KO1, optionsText: 'option', value: 'value', optionsCaption: 'Clinicians'"></select>
<select class="dropdown" data-bind="options: KO2 optionsText: 'option', value: 'value', optionsCaption: 'Document Types'"></select>
答案 0 :(得分:0)
您只能对元数据描述的类型执行本地查询。
没有更多信息我无法确定,但我的猜测是你的 GetSomeVals 方法不会返回'实体'而只是松散的数据。换句话说,从 GetSomeVals 方法返回的对象类型必须是实体(或包含投影中的实体)才能使breeze能够执行本地查询。这是因为Breeze知道如何缓存和查询实体,但不知道如何缓存“任意”查询结果。
请注意,您可以从服务器返回包含不同类型实体的匿名类型(为了填充大多数静态小数据集),但各个项必须是“实体”。在这种情况下,Breeze将拆分匿名结果并选择要包含在EntityManager缓存中的任何实体。
根据您如何使用promises执行本地查询的问题,请使用使用方法使用 FetchStrategy.FromLocalCache 。
即。这个查询
var results = em.executeQueryLocally(query)
也可以表示为:
query = query.using(FetchStrategy.FromLocalCache);
return em.executeQuery(query).then(data) {
var results = data.results;
}
本地查询仍然是同步执行但是看起来是异步的。