2012-12-17 23 views
2

我使用BackboneJS,我有一個集合,它從一個啓用oData的WebAPI獲取它的數據。在獲取數據時,我使用oData $ filter傳入一些額外的參數。Javascript,BackboneJS,oData單引號在請求

它看起來有點像這樣:

collection.fetch({ 
    data: $.param({ '$filter': 'Filter1 eq ' + filter.get('filter1') + 
        ' and Filter2 eq ' + filter.get('filter2') }), 
    //some more stuff... 
}) 

我基本上通過嚮導運行和建設一路此過濾器模型。來自此過濾器模型的每個值都是一個字符串值或一個空字符串。我已經重寫了過濾器模型上的get方法,以確保我從中獲得正確的值。請注意,如果字符串值不是空的,如果它是空的,則返回包含單詞'null'的字符串值。

var Filter = Backbone.Model.extend({   
    get: function (attributes, options) { 
     var value = Backbone.Model.prototype.get.call(this, attributes, options); 
     if (value == '') return 'null'; 
     else return "'" + value + "'"; 
    } 
}); 

說我的模型是這樣的:

{filter1: 'filter1', filter2: 'filter2'} 

現在,如果我取的Chrome和Firefox的集合,即生成看起來像這樣的要求:

replacedapiurl?%24filter=Filter1+eq+%27filter1%27+and+Filter2+eq+%27filter2%27 

這是非常好的,它在Firefox和Chrome都很棒。我遇到的問題是,在IE10中這是行不通的。由於某種原因,生成的請求看起來像這樣:

replacedapiurl?%24filter=Filter1+eq+'+filter1+'+and+Filter1+eq+'+filter1+' 

當我將它設置爲IE9模式時,它會執行相同的操作。當我將它設置爲IE8模式時,它突然開始工作。

現在我已經嘗試使用EncodeURI(),EncodeURIComponent(),escape()並在單引號前添加'\',這兩個都在我重寫的get方法內部和$ .param位內。但沒有任何工作。添加'\'什麼都不做,所有編碼都是這樣編碼添加的'+'符號:

replacedapiurl?%24filter=Filter1+eq+'%2520filter1%2520'+and+Filter1+eq+'%2520filter1%2520' 

這也不是我所追求的。

有誰知道爲什麼會發生這種情況?爲什麼IE瀏覽器版本與這種行爲有區別?我該如何解決它?我需要將我的單引號轉換爲'%27',最好不必編寫任何瀏覽器特定的代碼。

編輯:我只是有人在IE9上檢查的東西,並且工作正常,所以只有在使用IE10時 - 以及在IE9模式下使用IE10時 - 它不起作用。

回答

1

好吧,我認爲這超出了我,但最終它不是我自己修理的。爲了以後可以幫助任何人,我會解釋爲什麼這會發生在我身上。

過濾器對象中的值來自'select','select'在骨幹視圖內,並且選擇中填充了多個'option'視圖。出於某種原因,我有一個模板設置爲我的選擇視圖像這樣:

<script type="text/template" id="option-template"> 
<%=value%> 
</script> 

在HTML換行符上面說得那麼的「選項」被內部添加了一個額外的空間「選擇」渲染在價值的兩邊。 現在,我嘗試的所有其他瀏覽器和IE10之間的區別似乎是在IE10中,我的選項視圖中的這些空格不會被jQuery的val()修剪,而在所有其他瀏覽器中,它們在讀取值時會被修剪用val()選擇'select'。這導致額外的空間變成了值的兩側的「+」號,就像URL中的所有其他空格一樣,並且是問題所在!單引號本身不需要轉換爲%27,它應該以任一方式工作,something I picked up from the answer on this question

我不會有一個問題,如果我寫的模板,這樣一行:

<script type="text/template" id="option-template"><%=value%></script> 

反正,我只是擺脫了模板一起,改變了我的選擇以這樣的:

var optionView = Backbone.View.extend({ 
    tagName: "option", 
    render: function() { 
     this.$el.html(this.model.get('value')); 
    } 
}); 

而且修復了所有問題,所有選項周圍都沒有多餘的空間。

我想學到的教訓是,IE10不擺脫空間周圍的值,當你閱讀使用jQuery選擇框的值,像這樣:

var value = $('#id').val(); 

在任何其他瀏覽器,如果選項中有空格在「價值」周圍,它會自動修剪,價值將是「價值」,在IE10中,情況並非如此,價值將是「價值」。

+0

無論如何,OptionView有什麼用?它沒有任何行爲,難道你不能循環遍歷包含父模板中選項值的數組或對象。 – andho

+0

不錯,謝謝,我正在玩Marionette CompositeView和ItemView來看看事情是如何工作的,但是,在這種情況下,我不需要這個選項視圖。 –