【问题标题】:Breeze.JS to use angular.js httpBreeze.JS 使用 angular.js http
【发布时间】:2014-11-07 22:30:42
【问题描述】:

我正在尝试让 Breeze.JS 使用 angular 的 http 服务进行 ajax 调用。我遵循了文档(http://www.breezejs.com/documentation/customizing-ajax)并应用了它。但是它不起作用。

当我检查微风源代码时,我看到了以下内容:

fn.executeQuery = function (mappingContext) {

    var deferred = Q.defer();
    var url = mappingContext.getUrl();

    OData.read({
            requestUri: url,
            headers: { "DataServiceVersion": "2.0" }
        },
        function (data, response) {
            var inlineCount;
            if (data.__count) {
                // OData can return data.__count as a string
                inlineCount = parseInt(data.__count, 10);
            }
            return deferred.resolve({ results: data.results, inlineCount: inlineCount });
        },
        function (error) {
            return deferred.reject(createError(error, url));
        }
    );
    return deferred.promise;
};

它只是调用 OData.read 而不对 http 服务做任何事情。因此 OData 使用了内置的 ajax。我不明白上面的代码,如何自定义 Breeeze.JS 的 ajax

【问题讨论】:

    标签: angularjs breeze datajs


    【解决方案1】:

    问题在于 Breeze OData 路径不使用 Breeze Ajax 适配器。更改 Breeze Ajax 适配器(如“Breeze Angular 服务”所做的那样)将无济于事。

    目前,“OData”和“webApiOData”DataService 适配器都委托给第 3 方 datajs 库以提供 AJAX 服务(以及其他与 OData 相关的支持)。

    您可以将其odata.defaultHttpClient 替换为您自己的基于$http 的版本。这不是一项微不足道的任务。 Look here for the source code;大约有 160 行。

    我想我们可以写一个。这不是优先事项。

    直到有人这样做或我们放弃 datajs(如果有的话,也不会很快),你会被 datajs ajax 所困。

    对此感到抱歉。

    附言几乎所有与 OData 数据源交谈的人都使用 datajs 库。也许您可以与该库的作者交谈并尝试让他们支持$http

    【讨论】:

    • 好吧,我恢复到 WebAPI 提供程序。它工作正常,但有两件事是错误的。 1-) 它向 url 询问 /Metadata 而不是 /$metadata。 2-) 它要求提供 json 文档,而 $metadata 返回一个 xml。我找不到任何东西可以将 json 作为元数据返回。我通过说服务器没有元数据来解决它。我想知道这是否是一种安全的方法
    • 您如何生成 $metadata 端点?您使用的是 Web API OData 吗?为什么?为什么不直接使用 Web API?如果您坚持使用 Web API OData,那么您正在做的事情将不起作用……我担心您如何设置 Web API OData。你有没有密切关注最近的OData sample;有很多“陷阱”。他们确实还没有正确执行 OData。
    • 是的,我确实使用 Web API OData。因为我想使用标准 OData,并且我希望我的服务器能够独立于微风。在您的链接中它说:“Breeze 客户端可以向 OData 源询问元数据在我们的示例中,客户端向 localhost:55802/odata/$metadata 发送 GET 请求。“如果我使用“WebAPI”,它将如何将请求发送到 $metadata?如果我不使用 WebAPI,那么我就不能使用我自己的 httpclient,回到第一条?
    • 除此之外,您的链接面向 EF。我会使用休眠。但同样我不想向服务器介绍任何关于微风的内容。
    • NH/EF 无关紧要。该示例来自 Microsoft,他们始终使用 EF。但是如果你了解 NH,那么你就知道如何用 NH 来实现他们的控制器。如果您再看一遍,您会发现服务器上没有微风。我们所做的只是弥补他们搞砸了元数据生成的事实。我们告诉你用EdmBuilder 替换他们的ODataConventionModelBuilder,这不是一个微风组件,对微风一无所知。由于您没有使用 EF,这将不起作用……因此您必须手动创建元数据。对不起。
    【解决方案2】:

    快速而肮脏的 hack 来模拟 $http 服务

    我今天遇到了这个问题。由于使用了外部 datajs AJAX 方法而不是 Angular 的 $http 服务(如 Ward 所述),Breeze 查询不会触发摘要,模型也不会更新。

    与任何外部到角度的更改一样,简单的解决方案是将查询中的任何分配包装在 $scope.$apply() 函数中。但是,这会很快使您的应用变得混乱,所以这是个坏主意。

    我想出了一个快速而肮脏的 hack,到目前为止似乎效果很好:

    1. 我有一个 dataContextservice,它封装了我所有的 Breeze 查询并公开了 getCustomers()getProducts() 等方法(灵感来自 example on the Breeze site)。
    2. 当这些数据访问方法中的任何一个完成时(即 promise 解析),我调用 triggerAngularDigest() 方法。
    3. 此方法在$timeout() 内简单调用$rootScope.$apply()
    4. $timeout() 使 Angular 在下一个刻度上运行摘要,即在将来自 Breeze 查询的数据分配给模型之后。
    5. 您的所有模型都会更新,就像您使用 $http 时一样,无需在控制器中调用 $apply()

    简化版:

    function dataContext($rootScope, $timeout, breeze) {
    
        // config of entity manager etc snipped
    
        return {
            getCustomers: function () {
                return breeze.EntityQuery.from('Customers')
                    .using(manager)
                    .execute()
                    .then(function(data) {
                        triggerAngularDigest(); // <-- this is the key
                        return data;
                    });
            }
        };
    
        function triggerAngularDigest() {
            $timeout(function() {
                $rootScope.$apply();
            }, 0);
        }
    }
    
    myApp.factory('dataContext', dataContext);
    

    然后:

    // some controller in your app
    dataContext.getCustomers().then(function(data) {
        scope.customers = data;
    }); 
    

    【讨论】:

      猜你喜欢
      • 2013-03-20
      • 2016-04-18
      • 1970-01-01
      • 2016-06-09
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2013-08-16
      相关资源
      最近更新 更多