如何在breezeJS中共享数据

如何在breezeJS中共享数据,breeze,durandal,Breeze,Durandal,这里是一个例子,我有一个产品表和一个类别表,产品有一个类别,现在我想检索部分产品,意思是只选择productId、productName和categoryId 然后,我还只选择categoryName检索部分类别,到目前为止,我尝试将data.results映射到类别结果和产品结果的breeze entitys,但如何在它们之间共享数据 例如,我希望能够做到这一点: <section data-bind="foreach: Product"> <article data

这里是一个例子,我有一个产品表和一个类别表,产品有一个类别,现在我想检索部分产品,意思是只选择productId、productName和categoryId 然后,我还只选择categoryName检索部分类别,到目前为止,我尝试将data.results映射到类别结果和产品结果的breeze entitys,但如何在它们之间共享数据

例如,我希望能够做到这一点:

<section data-bind="foreach: Product">
    <article data-bind="text: productName"></article>
    <article data-bind="text: category().categoryName"></article>
</section>
原因是我有两个视图,一个显示产品,一个显示类别,在产品视图中,我需要一些类别信息,我不想两次点击服务器来获取两个视图的相同数据,我希望能够在它们之间共享这些数据

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

如果任何人遇到以下相同问题,请参考 样本将帮助您。

在这个示例中,我使用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足够聪明,可以找出关系并与产品实体共享数据。

假设您已经正确定义了产品和类别之间的关系,如果您指定Category.categoryId=product.categoryId,您应该能够通过调用product.category导航到类别。如果这不起作用,也许你可以展示一下你是如何定义产品和类别之间的关系的。它起作用了。我想我需要的不仅仅是映射,但实际上breeze足够聪明,能够找出这种关系。我认为这是元数据。如果你想在它上测试它,这段代码也会很好地为你服务,因为它们也使用northwind:)。
<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>