簡體   English   中英

Breeze.JS使用angular.js http

[英]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

快速而骯臟的黑客來模擬$ http服務

我今天遇到了這個問題。 由於使用外部datajs AJAX方法而不是Angular的$http服務(如Ward所述),因此Breeze查詢不會觸發摘要,並且不會更新模型。

與任何從外部到角度的更改一樣,簡單的解決方案是將查詢中的所有分配包裝在$scope.$apply()函數中。 但是,這會很快使您的應用程序混亂,所以這不是一個好主意。

我提出了一個快速而又骯臟的駭客,到目前為止看來運作良好:

  1. 我有一個dataContext服務,該服務封裝了我所有的Breeze查詢並公開了諸如getCustomers()getProducts()等之類的方法(受Breeze網站上的示例啟發)。
  2. 當這些數據訪問方法中的任何一個完成時(即,諾言triggerAngularDigest()解決),我將調用triggerAngularDigest()方法。
  3. 這個方法簡單地在$timeout()內部調用$rootScope.$apply() $timeout()
  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;
}); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM