1

问题

我有 6 个下拉菜单的视图。每个都由 Web API 调用填充。一旦从远程服务器填充查询,我想使用微风在本地运行查询

当数据调用针对服务器时,代码运行良好。问题在于尝试查询本地缓存时。我从来没有得到任何返回的结果。我的方法有缺陷还是我做错了什么?

服务器端

查看模型

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});}

}

客户端

数据上下文.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);
    }

视图模型.js

//In Durandal's activate method populate the observable arrays

dataContext.getDropDownBindings (KO1,KO2);

视图模型.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>
4

1 回答 1

0

您只能针对元数据描述的类型执行本地查询。

如果没有更多信息,我无法确定,但我的猜测是您的GetSomeVals方法没有返回“实体”,而只是松散的数据。换句话说,从GetSomeVals方法返回的对象类型必须是实体(或包含投影中的实体),以便让轻快能够执行本地查询。这是因为 Breeze 知道如何缓存和查询实体,但不知道如何缓存“任意”查询结果。

请注意,您可以从服务器返回包含不同类型实体的匿名类型(为了填充大部分静态的小型数据集),但各个项目必须是“实体”。在这种情况下,Breeze 将拆开匿名结果并挑选出任何要包含在 EntityManager 缓存中的实体。

根据您关于如何使用 Promise 执行本地查询的问题,请使用FetchStrategy.FromLocalCacheusing方法。

即这个查询

 var results = em.executeQueryLocally(query)

也可以表示为:

 query = query.using(FetchStrategy.FromLocalCache);
 return em.executeQuery(query).then(data) {
   var results = data.results;

 }

本地查询仍然同步执行,但看起来是异步的。

于 2013-05-21T15:50:58.407 回答