Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Breeze:无法找到一个';类型';姓名:';人';。请确保首先执行查询或调用fetchMetadata_Angularjs_Breeze - Fatal编程技术网

Angularjs Breeze:无法找到一个';类型';姓名:';人';。请确保首先执行查询或调用fetchMetadata

Angularjs Breeze:无法找到一个';类型';姓名:';人';。请确保首先执行查询或调用fetchMetadata,angularjs,breeze,Angularjs,Breeze,我已经从NuGet下载了hottawer.Angular.Breeze,并使用BreezeAPI控制器进行了设置 我已经配置了datacontext.js来创建一个新的管理器,并且创建并公开了一个函数来创建一个新的实体: function datacontext(emManager) { var manager = emManager.newManager(); var service = { create: create, save: save

我已经从NuGet下载了
hottawer.Angular.Breeze
,并使用BreezeAPI控制器进行了设置

我已经配置了
datacontext.js
来创建一个新的管理器,并且创建并公开了一个函数来创建一个新的实体:

function datacontext(emManager) {
    var manager = emManager.newManager();

    var service = {
        create: create,
        save: save
    };

    return service;

    function create(entityName) {
        return manager.createEntity(entityName);
    }

    function save() {
        return manager.saveChanges().to$q(saveSucceeded, saveFailed);

        function saveSucceeded(result) {
            // Save Successful
        }

        function saveFailed(error) {
            // Save Failed
        }
    }
}
然后在我的控制器中调用它,如下所示:

    function getNewPerson() {
        vm.person = datacontext.create(entityName);
        return vm.person;
    }
如果直接在浏览器中加载此页面,则会出现以下错误:

Error: Unable to locate a 'Type' by the name: 'Person'. 
Be sure to execute a query or call fetchMetadata first.
但是,如果我在执行查询后导航到该页面,它将正常加载,并且我能够保存新实体等

所以我的问题是,哪里是调用
fetchMetadata
的好地方?它会在
newManager
方法的
entityManagerFactory
中吗

    function newManager() {
        var mgr = new breeze.EntityManager({
            serviceName: serviceName,
            metadataStore: metadataStore
        });
        return mgr;
    }
编辑 我已经按照下面@Rob的建议进行了尝试,但仍然得到相同的错误:

    function setupMetadata() {
        var deferred = $q.defer();
        metadataStore.fetchMetadata(serviceName).then(function () {
            deferred.resolve();
        }).fail(function (ex) {
            deferred.reject(ex);
        });

        return deferred.promise;
    }
然后我放置
setupMetadata()内部
应用程序运行

app.run(['$route', '$rootScope', '$q', 'entityManagerFactory', function ($route, $rootScope, $q, emFactory) {
    // Include $route to kick start the router.
    breeze.core.extendQ($rootScope, $q);

    emFactory.setupMetadata();
}]);

在您的数据服务过程的顶部是breeze并创建一个新的元数据存储

        var servicePath = 'http://localhost/breeze/Blah';
        var metadataStore = new breeze.MetadataStore({
             //Configure Stuff
             //namingConvention: breeze.NamingConvention.camelCase
        });
然后获取元数据

        $rootScope.initialized = false;
        function setupMetadata() {
            var deferred = $q.defer();
            metadataStore.fetchMetadata(servicePath).then(function () {
                    $rootScope.initialized = trie;
                    deferred.resolve();
            }).fail(function (exception) {
                    deferred.reject(exception);
            });
            return deferred.promise;
        };
控制器

.controller('SomeCtrl', function($rootScope, $scope) { 
        $rootScope.$watch('initialized', function() {
            //Make initial calls
        });
}

我将公开此方法,以便在引导应用程序或进行身份验证时调用它,以确保在执行任何其他操作之前加载元数据存储

您应该首先检查元数据是否存在,然后创建新的person,您的创建方法如下所示

function create(entityName) {
        var hasMetadata = checkMetadata(manager, serviceName);
        if (hasMetadata) {
            return manager.createEntity(entityName);
        } else {
            return getMetadata(manager, serviceName).then(createPerson);
        }            
    }

function createPerson()
{
    return manager.createEntity(entityName);
}

//Check wther Metadata is present in the given manager or not
var checkMetadata = function (manager, serviceName) {
    try {
        var result = false;
        if (manager.metadataStore.hasMetadataFor(serviceName)) {
            result = true;
        }
        return result;
    } catch (e) {
        throw e;
    }
};

//Method to get Metadata from a given entityManager and serviceName
this.getMetadata = function (manager, serviceName) {
    var store = manager.metadataStore;
    return store.fetchMetadata(serviceName);
};

我想这会对你有帮助。

罗布说得对。像对待任何其他应用程序依赖项一样对待元数据。另一个选择:你可以。我正在按照建议进行尝试,然后在
应用程序中运行setupMetadata。运行
angular方法,但仍然会得到相同的错误。我已经编辑了我的问题来说明这一点。在fetchMetadata成功返回之前,您似乎仍在调用某些webapi方法。您是否正在加载任何在初始化时调用webapi的控制器?不,
fetchMetadata
返回一个承诺,我想知道是否有可能延迟angular应用程序的运行,直到返回为止?如果我在app.run中执行console.log,这是在调用任何web api之前输出的,因此理论上它应该可以工作..我用一种可能适用于您的方法更新了我的答案。您可以在需要等待元数据加载的控制器中添加手表,而不是尝试延迟加载。