Breeze:元数据.isEmpty()无法按预期工作

时间:2014-01-28 10:30:52

标签: breeze

我有以下方法:

function _getById(entityName, id, navigationProperty) {
        var self = this;
        var manager = self.manager;

        if (manager.metadataStore.isEmpty()) {
            return manager.fetchMetadata().then(function () {
                var entityType = manager.metadataStore.getEntityType(entityName);
                var entityKey = new EntityKey(entityType, id);

                return EntityQuery.fromEntityKey(entityKey)
                    .expand(navigationProperty)
                    .using(manager)
                    .execute()
                    .to$q(querySucceeded);
            });
        }
        else {
            var entityType = manager.metadataStore.getEntityType(entityName);
            var entityKey = new EntityKey(entityType, id);

            return EntityQuery.fromEntityKey(entityKey)
                .expand(navigationProperty)
                .using(manager)
                .execute()
                .to$q(querySucceeded);
        }

        function querySucceeded(data) {
            return data;
        }
    }

如果我通过应用程序导航到页面,这可以正常工作,但是,如果我直接加载该页面,我会收到以下错误:

Unable to locate a 'Type' by the name: 'Customer'. Be sure to execute a query 
or call fetchMetadata first.

单步执行代码,似乎转到else语句的if部分,暗示元数据存储不为空,但从错误中看,它似乎是?我在这做错了什么?

修改

我做了一些改动,但仍然得到了相同的结果:

    function _getById(entityName, id) {
        var self = this;
        var manager = self.manager;
        if (!manager.metadataStore.hasMetadataFor('breeze/ax')) {
            return manager.fetchMetadata()
               .then(_getEntityById(manager, entityName, id));
        }
        else {
            return $q.when(_getEntityById(manager, entityName, id));
        }
    }

    function _getEntityById(manager, entityName) {
        var entityType = manager.metadataStore.getEntityType(entityName);
        var entityKey = new EntityKey(entityType, id);

        return EntityQuery.fromEntityKey(entityKey)
            .using(manager)
            .execute()
            .to$q(querySucceeded);

        function querySucceeded(data) {
            var entity = data.results[0];
            return entity;
        }
    }

1 个答案:

答案 0 :(得分:0)

我之前碰到过这个。问题是;当你直接加载页面时,它会在完成对提取元数据的调用之前加载..(我假设你使用了DurandalJS

我所做的是在激活路由器之前调用shell视图中的方法fetchMetadata() 因此,在shell视图的activate方法中,您的代码可能如下所示:

  function activate() {

            return manager.fetchMetadata()
                 .then(boot)
                 .fail(failedInitialization);
        }

 function boot() {
            return router.map(routes)   // routes is our array of routes  
                .buildNavigationModel() 
                .activate();
        }

在这种情况下,您不必检查元数据的状态,因为在加载应用程序之前它将被调用,MetadataStore.hasMetadataFor将始终返回false。