breeze.js如何在2个实体管理器之间共享元数据

时间:2014-05-07 20:34:07

标签: javascript entity metadata breeze entitymanager

我有2个实体经理:

var mgr1 = new breeze.EntityManager('api/app');
var mgr2 = new breeze.EntityManager('api/app');

现在我分别获取每个元数据的元数据,尽管元数据完全相同。我正在显式调用fetch方法来控制加载元数据的时间。

mgr1.fetchMetadata();
mgr2.fetchMetadata();

我已经读过我可以在两位经理之间共享元数据,但我还没有找到一个例子。从我读过的内容来看,我认为我可以在第二个管理器的构造函数中指定元数据,该构造函数引用第一个管理器的元数据,但不确定它会是什么样子。所以我的代码看起来像这样:

var mgr1 = new breeze.EntityManager('api/app');
mgr1.fetchMetadata();
var mgr2 = new breeze.EntityManager({ serviceName: 'api/app', metadata: WHAT_GOES_HERE});

我知道我也必须用承诺来解决这个问题,所以在第一位经理加载元数据之前,第二位经理还没有建成。

我是否在正确的道路上?我的目标是消除额外的带宽来加载第二个管理器的元数据。感谢

2 个答案:

答案 0 :(得分:2)

您实际上不必获取元数据来共享相同的MetadataStore。以下两个陈述是一个非常清晰的方法:

var em1 = new breeze.EntityManager('api/app'); 
var em2 = em1.createEmptyCopy();

我不想变聪明。我的观点是,MetadataStore是元数据的容器,在EntityManager创建后立即可用,并且在保存任何元数据之前已经明确定义。

createEmptyCopy()方法"克隆"管理员没有复制其实体缓存内容。复制的属性包括经理MetadataStore及其DataService

因为管理员共享相同的MetadataStore,所以使用 管理器获取元数据就可以了。

查看EntityManagerMetadataStore的Breeze API文档。

答案 1 :(得分:1)

我以前从未使用过breeze.js,但是根据我从文档中收集的内容(http://www.breezejs.com/sites/all/apidocs/classes/EntityManager.html),这样的事情应该有效:

var mgr1 = new breeze.EntityManager('api/app');
mgr1.fetchMetadata();
var mgr2 = new breeze.EntityManager({
   serviceName: 'api/app', 
   metadataStore: mgr1.metadataStore
});

当然,mgr2承诺应在mgr1.fetchMetadata承诺完成后设置,正如您在问题中所说的那样。