如何在breezeJS中共享数据

时间:2014-04-24 02:34:52

标签: breeze durandal

所以这是我得到产品表和类别表的情况,产品有一个类别,现在我想要检索部分产品意味着只选择productId,productName和categoryId 然后我还检索仅选择categoryName的部分类别,到目前为止,我尝试将data.results maping为类别结果和产品结果的breeze实体,但如何在它们之间共享数据?

例如,我希望能够这样做:

<section data-bind="foreach: Product">
    <article data-bind="text: productName"></article>
    <article data-bind="text: category().categoryName"></article>
</section>

映射逻辑

function mapDtosToEntities(manager, dtos, entityName, keyName, extendWith) {

    return dtos.map(dtoToEntityMapper);

    function dtoToEntityMapper(dto) {
        var keyValue = dto[keyName];
        var entity = manager.getEntityByKey(entityName, keyValue);
        if (!entity) {
            // We don't have it, so create it as a partial
            extendWith = $.extend({ }, extendWith || defaultExtension);
            extendWith[keyName] = keyValue;
            entity = manager.createEntity(entityName, extendWith);
        }
        mapToEntity(entity, dto);
        entity.entityAspect.setUnchanged();
        return entity;
    }

    function mapToEntity(entity, dto) {
        // entity is an object with observables
        // dto is from json
        for (var prop in dto) {
            if (dto.hasOwnProperty(prop)) {
                entity[prop](dto[prop]);
            }
        }
        return entity;
    }
}

原因是我有2个显示产品的视图和一个显示类别的视图,在产品视图中我需要一些类别信息,我不想两次点击服务器来获取两者的相同数据我希望能够在它们之间共享这些数据。

注意:我正在与durandal合作,不知道这是否重要。

1 个答案:

答案 0 :(得分:0)

  

如果任何人遇到同样的问题,以下供将来参考   示例会对您有所帮助。

在这个示例中,我使用northwind作为如何实现此目的的真实示例。

<强>的javascript

var EntityQuery = breeze.EntityQuery,
        manager = configureBreezeManager();

var defaultExtension = { IsPartial: true };

function configureBreezeManager() {
        breeze.NamingConvention.camelCase.setAsDefault();
        var mgr = new breeze.EntityManager('api/northwind');
        mgr.metadataStore.registerEntityTypeCtor(
            'Category', function () { this.IsPartial = false; });
        mgr.metadataStore.registerEntityTypeCtor(
            'Product', function () { this.IsPartial = false; });
        return mgr;
}

var model = function(){
  this.Products = ko.observableArray([]);
};

var modelInstance = new model();

function mapDtosToEntities(mgr, dtos, entityName, keyName, extendWith) {
  return dtos.map(dtoToEntityMapper);
  function dtoToEntityMapper(dto) {
    var keyValue = dto[keyName];
    var entity = mgr.getEntityByKey(entityName, keyValue);
    if (!entity) {
      // We don't have it, so create it as a partial
      extendWith = $.extend({ }, extendWith || defaultExtension);
      alert(JSON.stringify(extendWith))
      extendWith[keyName] = keyValue;
      alert(JSON.stringify(extendWith));
      entity = mgr.createEntity(entityName, extendWith);
    }
    mapToEntity(entity, dto);
    entity.entityAspect.setUnchanged();
    return entity;
  }

  function mapToEntity(entity, dto) {
    for (var prop in dto) {
      if (dto.hasOwnProperty(prop)) {
        entity[prop](dto[prop]);
      }
    }
    return entity;
  }
}

var query = new EntityQuery()
    .from("Products")
    .select("productID, productName, categoryID");

var queryx = new EntityQuery()
    .select("categoryID, categoryName")
    .from("Categories");

manager.executeQuery(queryx)
  .then(querySucceededx)
  .fail(function(error){ alert(error + "queryx"); });

function querySucceeded(data) {
  var list = mapDtosToEntities(manager, data.results, "Product", "productID");
  modelInstance.Products(list);
}

function querySucceededx(data) {
  var list = mapDtosToEntities(manager, data.results, "Category", "categoryID");
  manager.executeQuery(query)
  .then(querySucceeded)
  .fail(function(error){ alert(error + "query"); });
}

ko.applyBindings(modelInstance);

<强> HTML

<ul data-bind="foreach: Products">
  <li>
    <span data-bind="text: productID"></span>
    <span data-bind="text: productName"></span> ---
    <span data-bind="text: category().categoryName"></span>
  </li>
</ul>

映射将适用于id匹配breeze足够聪明,可以找出关系并与产品实体共享数据。