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