在 JavaScript 中以编程方式设置构造函数参数

Programmatically Set Constructor Parameters in Javascript

本文关键字:设置 构造函数 参数 方式 编程 JavaScript      更新时间:2023-09-26

我正在尝试与javascript api进行交互(请记住,我以前从未这样做过)。我尝试使用的一个例子在这里:

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); }
});

在示例中,我想添加一个带有值的"背景过滤器":

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

如何将此类别和值添加到上面列出的背景过滤器中?

这是使用框架时非常常见的框架初始化模式。

您的示例代码将 JavaScript 对象{}作为参数传递到称为 init 的函数()中。

去掉所有定义,模式如下所示:

SomeFramework.frameworkFunction({});

在上面的代码中,{}是一个用于初始化的空对象。在实践中,有两种方法可以使用该对象。

关于您的第一个代码片段,您可以将代码添加到该"对象文字"中。

背景过滤器:{ 类别: ["衬衫", "鞋子"], 部门: ['男士'], 猫: ["我的价值"]},

请注意添加的逗号,这是一个重要的绊脚点。这可能适合也可能不适合您的需求,具体取决于几个因素。

关于第二个代码片段,您可以在运行时将成员应用于 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 创建一个名为 cat 的字符串对象。 2 将值更改为新字符串。我不认为这是你真正想要的。

要添加新的背景过滤器,以上面的分离方式,它将是:

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']
        },

为此,它将取决于框架对背景过滤器的期望。

希望有帮助。万事如意!纳什

我不太明白 - 你想让 backgroundFilters 类别作为结构化对象而不是纯字符串吗?如果你控制了整个API,你可以做一些类似的事情

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