Breeze.JS使用angular.js http

时间:2014-03-15 16:08:38

标签: angularjs breeze datajs

我正在努力让Breeze.JS利用角度的http服务进行ajax调用。我按照文档(http://www.breezejs.com/documentation/customizing-ajax)进行了应用。但是它没有用。

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

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

2 个答案:

答案 0 :(得分:3)

问题是Breeze OData路径不使用Breeze Ajax适配器。更改Breeze Ajax适配器(作为" Breeze Angular Service"确实如此)不会有帮助。

此刻," OData"和" webApiOData" DataService Adapters委托第三方 datajs 库获取AJAX服务(以及其他与OData相关的支持)。

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

我想我们可以写一个。它没有成为优先事项。

在有人这样做或我们放弃 datajs 之前(不会很快),你仍然坚持使用 datajs ajax。

很抱歉。

P.S。几乎每个与OData数据源对话的人都使用 datajs 库。也许您可以与该库的作者交谈,并尝试让他们支持$http

答案 1 :(得分:1)

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

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

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

我提出了一个快速而肮脏的黑客,到目前为止似乎运作良好:

  1. 我有一个dataContext服务,它封装了我的所有Breeze查询,并公开了getCustomers()getProducts()等方法(灵感来自example on the Breeze site)。
  2. 当这些数据访问方法中的任何一个完成时(即承诺解析),我调用triggerAngularDigest()方法。
  3. 此方法只需在$rootScope.$apply()内调用$timeout()
  4. $timeout()会导致Angular在下一个刻度线上运行摘要,即将Breeze查询中的数据分配给模型后。
  5. 所有模型的更新方式与使用$http时相同,无需在控制器中调用$apply()
  6. 简化版:

    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;
    });