2012-06-13 66 views
1

我正在嘗試與javascript api進行交互(我從來沒有這樣做過)。什麼,我試圖與合作的一個例子是在這裏:以編程方式在Javascript中設置構造函數參數

SearchSpring.Catalog.init({ 
    leaveInitialResults : true, 
    facets : '.leftNav', 
    results : '#results', 
    result_layout: 'list', 
    results_per_page : 12, 
    layout: 'top', 
    loadCSS: false, 
    filters: { 
     color: ['Blue'] 
    }, 
    backgroundFilters: { 
     category: ['Shirt', 'Shoes'], 
     department: ['Mens'] 
    }, 
    maxFacets: 5, 
    maxFacetOptions: 10, 
    sortText: 'Sort By ', 
    sortType: 'dropdown', 
    filterText: 'Refine Search Results', 
    previousText: 'Previous', 
    scrollType: 'scroll', 
    scrollTo: 'body', 
    backgroundSortField: 'price', 
    backgroundSortDir: 'desc', 
    compareText: 'Compare Items', 
    summaryText: 'Current Filters', 
    showSummary: true, 
    subSearchText: 'Subsearch:', 
    showSubSearch: true, 
    forwardSingle: false, 
    afterResultsChange: function() { $('.pagination').hide(); }, 
    filterData: function(data) { console.debug(data); } 
}); 

在這個例子中我想要一個「backgroundFilter」添加到這一個值:

var cat="MyNewCategory"; 
cat.value="ANewValue; 

我將如何添加此類別和值backgroundFilters:上面列出?

+0

這是你在找什麼? 'catalog.backgroundFilters.category.push('MyNewCategory');' –

+0

這就是我所要做的嗎?我如何添加一個值。 –

+0

你是什麼意思添加一個值?你給什麼增值? –

回答

1

這是一個非常常見的使用框架的框架初始化模式。

您的示例代碼將一個JavaScript對象{}作爲參數傳遞給名爲init的函數()

取出所有定義的圖案看起來像這樣:

SomeFramework.frameworkFunction({}); 

在上面的代碼中{}是用於初始化一個空對象。實踐中可以使用兩種方法處理該對象。

關於您的第一個代碼片段,您可以將代碼添加到「對象字面量」中。

backgroundFilters:{ 類別:[ '襯衫', '鞋'], 部門:[ '男裝'], 貓: '我的價值'] },

注意添加逗號,這是一個重要的跳閘點。這可能會或可能不適合您的需求,具體取決於幾個因素。

關於你的第二個代碼片段,你可以在運行時將成員應用到JavaScript對象。我的意思是,你的var cat可以被添加到正在傳入的匿名對象文字中。很難說,但是一個簡單的概念。這是如何:

//Say this is initialized in some separate way. //There is a bug here I'll describe later. 
var cat="MyNewCategory"; 
cat.value="ANewValue"; 

//Extract and name the initialization object. It is verbatim at this point. 
var initObject = { 
    leaveInitialResults : true, 
    facets : '.leftNav', 
    results : '#results', 
    result_layout: 'list', 
    results_per_page : 12, 
    layout: 'top', 
    loadCSS: false, 
    filters: { 
     color: ['Blue'] 
    }, 
    backgroundFilters: { 
     category: ['Shirt', 'Shoes'], 
     department: ['Mens'] 
    }, 
    maxFacets: 5, 
    maxFacetOptions: 10, 
    sortText: 'Sort By ', 
    sortType: 'dropdown', 
    filterText: 'Refine Search Results', 
    previousText: 'Previous', 
    scrollType: 'scroll', 
    scrollTo: 'body', 
    backgroundSortField: 'price', 
    backgroundSortDir: 'desc', 
    compareText: 'Compare Items', 
    summaryText: 'Current Filters', 
    showSummary: true, 
    subSearchText: 'Subsearch:', 
    showSubSearch: true, 
    forwardSingle: false, 
    afterResultsChange: function() { $('.pagination').hide(); }, 
    filterData: function(data) { console.debug(data); } 
}; 

//Now we can add variables (and functions) dynamically at runtime. 
initObject.cat = cat; 

//And pass them into the framework initialization in a separated way. 
SearchSpring.Catalog.init(initObject); 

現在的錯誤。我不知道解決方案,因爲我不知道它打算做什麼,但我可以指出什麼可能是不正確的。

var cat =「MyNewCategory」; cat.value =「ANewValue;

此代碼是:1,創建一個名爲貓String對象2將值更改爲一個新的字符串 我不認爲這是你真正想要的

要。添加一個新的backgroundFilter,在上述分離的方式,這將是:

initObject.backgroundFilters.cat = ['A', 'B']; 

//Line above would give you this type of definition within the initObject (at runtime): 
     backgroundFilters: { 
      category: ['Shirt', 'Shoes'], 
      department: ['Mens'], 
      cat: ['A','B'] 

     }, 

對於這項工作將依靠什麼框架期待關於ba​​ckgroundFilters。

希望有所幫助。 一切順利! 納什

0

我不太明白 - 你想要backgroundFilters類作爲結構化對象而不是純字符串嗎?如果你在控制整個API,你可以做類似於

... 
backgroundFilters: { 
    category: [ 
     new SearchSpring.Catalog.Category("Shirt"), 
     new SearchSpring.Catalog.Category("Shoes"), 
     new SearchSpring.Catalog.Category("MyNewCategory", "ANewValue") 
    ], 
    department: 'Mens' 
} 
... 
+0

熊在這裏..我有點霧是這個對象是一個函數的參數,我看到它的方式。那是對的嗎?你能詳細說明一下你的例子來展示如何設置代碼,如果新的backgroundFilter來自一個變量,並且新的過濾器的值來自另一個變量 –

相關問題