我正在努力让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
答案 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)
我今天遇到了这个问题。由于使用外部datajs AJAX方法而不是Angular的$http
服务(如Ward所述),Breeze查询不会触发摘要,模型也不会更新。
与任何外部角度更改一样,简单的解决方案是在$scope.$apply()
函数中包装查询中的任何分配。但是,这会很快混乱你的应用程序,所以这是一个坏主意。
我提出了一个快速而肮脏的黑客,到目前为止似乎运作良好:
dataContext
服务,它封装了我的所有Breeze查询,并公开了getCustomers()
,getProducts()
等方法(灵感来自example on the Breeze site)。triggerAngularDigest()
方法。$rootScope.$apply()
内调用$timeout()
。$timeout()
会导致Angular在下一个刻度线上运行摘要,即将Breeze查询中的数据分配给模型后。 $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;
});