2014-02-08 69 views
0

我已經看到其他問題,並且我不認爲我的問題是這些問題的重複。Breezejs:[Q]未處理的拒絕原因(應爲空)

Breezejs [Q] Unhandled rejection reasons (should be empty)

Unhandled rejection reasons (should be empty)

好了,所以我一直在breezejs跟進;儘可能接近文檔以及樣本,但我仍然遇到同樣的問題。我將在IE9 +和Chrome上展示代碼,但是當我在IE7和IE8中嘗試它時,它會爆炸。

這裏是(使用的WebAPI 2)我的服務器端控制器:

namespace Map.API.Controllers 
{ 
    [BreezeController] 
    public class LocationController : ApiController 
    { 
     readonly EFContextProvider<LocationEntities> _contextProvider = 
      new EFContextProvider<LocationEntities>(); 

     [HttpGet] 
     public string Metadata() 
     { 
      return _contextProvider.Metadata(); 
     } 

     [HttpGet] 
     public IQueryable<dbSTATES> States() 
     { 
      return _contextProvider.Context.MD_STATE_CD; 
     } 
    } 
} 

這裏是我的角度廠:

mapapp.app.factory('StateContext', ['$http', 'StateModel', function ($http, StateModel) { 
    configureBreeze(); 
    var dataService = new breeze.DataService({ 
     serviceName: "/Map.API/api/Location" 
    }); 

    var datacontext = { 
     getAllStates: getAllStates, 
     getCachedStates: getCachedStates 
    }; 
    return datacontext; 

    /* BLOWS UP AFTER RUNNING MANAGER.EXECUTEQUERY(QUERY) */ 
    function getAllStates() { 
     var query = breeze.EntityQuery 
       .from("States"); 
     return manager.executeQuery(query); 
    } 

    function getCachedStates() { 
     var query = breeze.EntityQuery 
     .from("States").toType('MD_STATE_CD'); 
     return manager.executeQueryLocally(query); 
    } 

    function configureBreeze() { 
     // configure to use webapi 
     breeze.config.initializeAdapterInstances({ dataService: "webApi" }); 
    } 
} 

這裏是我如何從我的角度控制器調用它:

StateContext.getAllStates().then(
     function (data) { 
      var localData = data.results; //never gets here 
      logger.info("Fetched States"); 
     }).fail(function (e) { 
      logger.info(e); //always gets here 
     }).done(); 

同樣,這在現代瀏覽器中運行良好,但在IE7和IE8中爆炸。經過大量的研究,沒有人提到這會失敗。儘管BreezeJS文檔提到了IE7中一些失敗的東西,但應該有明確的信息說這絕對不會起作用。

如果我碰巧關元:

var dataService = new breeze.DataService({ 
    serviceName: "/Map.API/api/Location", 
    hasServerMetadata: false 
}); 

那麼這個作品在所有的瀏覽器。但我希望打開元數據以便我可以進行緩存。然而,我最擔心的是,即使我修復了這個問題,我也不知道緩存是否仍然可以在IE7中正常工作。

即使我喜歡BreezeJS,它在谷歌瀏覽器上表現得非常出色,但我花了幾個小時,幾天,幾周時間和頭痛來製作我想在IE7中工作的內容。添加大量的瀏覽器支持腳本,即shiv和ie-shims ..非常接近,然後找不到localStorage。我希望BreezeJS會記錄更多關於IE7不支持的內容,我有很大一部分客戶使用IE7和IE8,並且編寫程序並在幾小時後發現它不起作用是非常困難的。

回答

1

Breeze + Angular在IE8或更早版本中不起作用。對不起,你花了很長時間才發現這一點。我也很抱歉,你被詛咒需要支持IE7和IE8;這是一項艱鉅的任務。

我們從一開始就在文檔中對此進行了相當清晰和前瞻性的介紹。例如,請參閱"Todo Angular Sample"Breeze/Angular頁上的大藍色注意框。

使用術語「breeze angular ie8」搜索StackOverflow會返回January 2013 question and answer,我們再次明確地指出,Breeze和Angular的組合不起作用,並且在IE8或任何缺乏對ECMAScript 5屬性與getter和setters。

您是否知道Angular團隊在1.x版本序列中的所有未來版本中都將支持IE8?他們說可能在IE8中工作,但他們將不會再進行嘗試以確保它不會......但是他們也不會去測試它是否確實如此。

我應該補充一點,Breeze在IE8(也可能是IE7)中與Knockout(和Durandal)一起工作良好,儘管我們也停止在IE8上測試Breeze。

最後,讓我說,我留下了深刻的印象,你能夠讓Breeze + Angular在IE7中工作。我祝你在努力中最好。

+0

嗯,我認爲微風在ie9及以上版本上運行良好,我考慮到它;但是像我工作的大多數技術一樣,在使用後向支持庫時,後向支持是可行的。我並沒有在ie7上真正體驗過任何有關angular的問題,我很高興使用它而不是使用knockout。 BreezeJS和元數據是我的問題。沒有元數據的BreezeJS在IE7中工作正常,但只有服務器完成所有查詢工作。 – sksallaj

+0

我讀過關於javascript中沒有支持什麼的回覆「沒有defineProperty」或「沒有geters或setter」,但我很樂觀地認爲我並不需要它。如果回覆中包含諸如「BreezeJS僅支持IE9及更高版本緩存」的內容,那麼避免這種情況會很有幫助;因爲我不知道Breeze的核心JS內部使用了什麼。至於角度支持,這是可以理解的,但同時令人失望。如果有兩個版本的產品(Kinga就像JQuery 2.X和1.X),它會很好,它允許向後支持。 – sksallaj

+0

「,但只有當服務器完成所有查詢」oops「的工作時,對於那個錯誤感到抱歉。我的意思是,只有當我不想使用緩存。 IE7能夠查詢服務器並獲得結果。 – sksallaj

2

我並不是故意將責任歸咎於Breeze技術,因爲我的應用程序。我很晚才意識到這也是一件有趣的事情。然而,我已經實現了這樣的應用程序,Breeze + Angular在IE7上工作。只需要關閉一些功能。

(不建議使用的方式)
我已經決定 「版本」 我的方式的JavaScript,我可以檢測到舊版本的IE,讓accomadations:

Detect IE version in Javascript

所以在我的javascript代碼,我會檢測是否正在使用較舊的IE瀏覽器,並從那裏重新獲取我如何獲取數據;如果使用新的瀏覽器,我會利用BreezeJS + Angular的優勢。

(有用的建議)
這是一個有點令人失望,它已經到了這一點。

要妥善處理查詢,我讀過後(如花的作者)對本文檔介紹的查詢/處理模式:

https://cuttingedge.it/blogs/steven/pivot/entry.php?id=92

的人誰願意與淘汰賽的角度狀框架(只是爲了支持舊版瀏覽器),看看durandal:http://durandaljs.com/(這似乎正在獲得支持淘汰賽和角扇)

(更新 - 2014年8月11日 - 我刪除了關於[如果lt IE8 ]在瀏覽器中,並通過javascript處理米y控制器。我也刪除了所有瀏覽器的緩存能力,服務器處理工作很好,需要什麼

由於角度不支持IE7很好,我把代碼分成兩個不同的頁面,一個叫做Home.html, HomeIE7.html。雖然它比較維護,但我認爲它比在一個html頁面中有兩組邏輯更好。對於我所做的任何更改,我使用了一個名爲「Beyond Compare」的程序,它允許我分析這兩個文件並確保兩者之間的邏輯相同。

要在兩個頁面之間切換,這是我開始的index.html的樣子:

<!DOCTYPE html> 

<div ng-app="mapapp" id="ng-app"> 
    <div ng-controller="LocationCtrl"> 
     <div ng-include="homeHTML" /> 
    </div> 
</div> 

和控制器:

//templates to use - picks html to use, and doesn't use the ajax caching 
$scope.homeHTML = !$('html').hasClass('msie7') ? 
         "Templates/Home.html?" + new Date().getTime() : 
         "Templates/HomeIE7.html?" + new Date().getTime(); 

記住,如果你使用的是IE7,使確保在你的服務調用中,微風關閉了服務器元數據。

var dataService = new breeze.DataService({ 
    serviceName: serviceName, 
    hasServerMetadata: false 
}); 

由於IE7無法使用任何可擴展的使用服務器元數據的功能。要了解這些可擴展功能,請點擊以下:Breeze Metadata

關閉hasServerMetadata後,您實體的響應看起來就像一個普通的javascript對象。如果它已打開,並且您不使用IE7,則它將是一個實體對象,您可以緩存並進行查詢。

相關問題