[英]Breeze.JS to use angular.js http
我正在嘗試使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
問題是Breeze OData路徑不使用Breeze Ajax適配器。 更改Breeze Ajax適配器(如“ Breeze Angular Service”一樣)將無濟於事。
目前,“ OData”和“ webApiOData” DataService適配器都委派給AJAX服務(以及其他與OData相關的支持)的第三方datajs庫。
您可以將其odata.defaultHttpClient
替換為您自己的基於$http
。 這不是一件容易的事。 在這里查看源代碼 ; 大約有160行。
我想我們可以寫一個。 這不是優先事項。
除非有人這樣做,否則我們將放棄datajs (如果有的話,很快就會放棄),您將無法使用datajs ajax。
對於那個很抱歉。
ps幾乎所有與OData數據源對話的人都使用datajs庫。 也許您可以與該庫的作者交談,並嘗試使他們支持$http
。
我今天遇到了這個問題。 由於使用外部datajs AJAX方法而不是Angular的$http
服務(如Ward所述),因此Breeze查詢不會觸發摘要,並且不會更新模型。
與任何從外部到角度的更改一樣,簡單的解決方案是將查詢中的所有分配包裝在$scope.$apply()
函數中。 但是,這會很快使您的應用程序混亂,所以這不是一個好主意。
我提出了一個快速而又骯臟的駭客,到目前為止看來運作良好:
dataContext
服務,該服務封裝了我所有的Breeze查詢並公開了諸如getCustomers()
, getProducts()
等之類的方法(受Breeze網站上的示例啟發)。 triggerAngularDigest()
解決),我將調用triggerAngularDigest()
方法。 $timeout()
內部調用$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;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.