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

}

クライアント側

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>
4

1 に答える 1

0

メタデータによって記述された型に対してのみ、ローカル クエリを実行できます。

これ以上の情報がなければ確信は持てませんが、私の推測では、GetSomeValsメソッドは「エンティティ」を返すのではなく、データを失っているだけです。つまり、breeze がローカル クエリを実行できるようにするには、 GetSomeValsメソッドから返されるオブジェクトの型がエンティティである (またはプロジェクション内にエンティティを含む) 必要があります。これは、Breeze がエンティティをキャッシュしてクエリする方法を知っているが、「任意の」クエリ結果をキャッシュする方法を知らないためです。

サーバーからさまざまなタイプのエンティティを含む匿名タイプを返すことができますが (主に静的な小さなデータセットを設定するため)、個々のアイテムは「エンティティ」である必要があります。この場合、Breeze は anon の結果を分解し、EntityManager キャッシュに含めるエンティティを選択します。

Promise を使用してローカル クエリを実行する方法については、 usingメソッドでFetchStrategy.FromLocalCacheを使用してください。

つまり、このクエリ

 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 に答える