2

我已经尝试使用微风和 OData 一段时间了。

我的 OData 来自另一台服务器,并且启用了 CORS。我相信问题出在微风和 odata 上,因为我已经使用微风和 web api 测试了所有内容,并且效果很好。

在网络选项卡中的 chrome 中,我看到 OData 已正确获取,但由于某种原因未显示数据,并且出现此奇怪错误:

[Q] Unhandled rejection reasons (should be empty): 
[Error]
 q.js:891
Error: OK Logger.js:52


Here is my breeze DataService:

app.adminMuscleGroup.dataService = ( function(breeze, logger) {



    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

    var service = new breeze.DataService({
        serviceName: "http://localhost:23758/odata/",
        hasServerMetadata: false,

    });

    breeze.config.initializeAdapterInstance("dataService", "OData");


    var manager = new breeze.EntityManager({ dataService: service });

    manager.enableSaveQueuing(true);

    var dataService = {
        getAll: getAll,
    };

    return dataService;

    function getAll() {
        var query = breeze.EntityQuery.from("MuscleGroup").orderBy("Name");

        return manager.executeQuery(query);
    }

这是Controller.js:

app.adminMuscleGroup.controller('AdminMuscleGroupCtrl', function ($scope) {

    var dataService = window.app.adminMuscleGroup.dataService;
    var logger = window.app.logger;

    $scope.items = [];

    $scope.getAllMuscleGroups = function() {
        dataService.getAll()
            .then(querySucceeded)
            .fail(queryFailed);
    };

    $scope.getAllMuscleGroups();

    function querySucceeded(data) {
        $scope.items = [];
        data.results.forEach(function(item) {
            $scope.items.push(item);
        });

        $scope.$apply();

        logger.info("Fetched all Muscle Groups");
    }

    function queryFailed(error) {
        logger.error(error.message, "Query failed");
    }

})

这是控制台日志的屏幕截图:

在此处输入图像描述

4

3 回答 3

2

正如您在我在这里提出的问题中看到的那样,我发现在将常规 EntitySetControllers 用于 OData 和 CORS 时,微风无法正常工作,并且要让它们工作,控制器应该是使用Breeze 的 BreezeControllerAttribute 装饰的常规 ApiController。网络接口。它可能已经更新了,但我有一段时间没有尝试过。

于 2013-08-04T16:26:11.203 回答
1

一般来说,当我看到“应该为空”时,这意味着承诺包含未处理的拒绝、其他未处理的错误,或者由于某种原因根本没有返回承诺。通常,当我遇到此错误时,我会确保使用 console.log() 拒绝原因或使用您正在使用的记录器之类的东西。您可以通过多种方式执行此操作,但这应该为您提供拒绝的理由,前提是您没有使用诸如 executeQueryLocally 之类的同步查询 -

function getAll() {
    var query = breeze.EntityQuery.from("MuscleGroup").orderBy("Name");

    // added a promise failure handler 
    return manager.executeQuery(query).fail(queryFailed);
}

并将以下内容添加到您的数据服务或 w/e

function queryFailed(error) {
    var msg = 'Error retrieving data. ' + error.message;
    logger.logError(msg, error, 'Data call', true);
}

编辑

好的,现在我们知道在处理数据时出了点问题,让我们看看返回了什么 -

编辑 2

听起来这个问题需要 Ward 和 Jay 的神奇力量——祝你好运!

于 2013-08-03T20:52:15.810 回答
0

您只需要添加这个额外的参数“DataServiceVersion, MaxDataServiceVersion”来配置 enableCors。

config.EnableCors(new EnableCorsAttribute(" ", " ", "*", "DataServiceVersion, MaxDataServiceVersion"));

于 2014-05-31T17:50:15.047 回答