【问题标题】:Function statement requires a name函数语句需要一个名称
【发布时间】:2015-10-01 08:40:00
【问题描述】:

我已经尝试了各种方法,但我错过了一些东西......

这是我的代码:

Mobile.Customer = (function (params) {

var viewModel = {

    };

    return {

        viewModel: viewModel
    }
   var gridDataSourceConfiguration = [{
            "InternalID": 1,
            "Code": 'TEST 1',
            "Name": 'Test 1 Test 1'
        }, 
        {
            "InternalID": 4,
            "Code": 'TEST 2',
            "Name": 'Test 2 Test 2'
        }, 
        {
            "InternalID": 5,
            "Code": 'TEST 3',
            "Name": 'Test 3 Test 3'

        }];

    var dataGrid = $("#gridContainer").dxDataGrid({
        dataSource: gridDataSourceConfiguration,
        filterRow: {
            visible: true,
            applyFilter: "auto"
        },
        searchPanel: {
            visible: true,
            width: 240,
            placeholder: 'Search...'
        },
        headerFilter: {
            visible: true
        },
        columns: [{
            dataField: "InternalID",
            width: 30,
            caption: "ID"
        }, {
            dataField: 'Name',
            alignment: 'right',
            //dataType: 'date'
        }, {
            dataField: "Code",
            alignment: 'right',
            // format: "currency"
        }
        ]
    }()).dxDataGrid('instance');

    var applyFilterTypes = [{
        key: "auto",
        name: "Immediately"
    }, {
        key: "onClick",
        name: "On Button Click"
    }]

    $("#useFilterApplyButton").dxSelectBox({
        items: applyFilterTypes,
        value: applyFilterTypes[0].key,
        valueExpr: "key",
        displayExpr: "name",
        onValueChanged: (function (data) {
            dataGrid.option("filterRow.applyFilter", data.value);
        }())
    }());

    $("#filterRow").dxCheckBox({
        text: "Filter Row",
        value: true,
        onValueChanged: (function (data) {
            dataGrid.clearFilter();
            dataGrid.option("filterRow.visible", data.value);
            $(".apply-filter-option").css("display", data.value ? "block" : "none");
        }())
    }());
})();

它在第一行就抱怨,所以我不知道该怎么办。在某个地方我有一个额外的 () 或其他东西 - 我不知道。我对这段代码很陌生。

有人可以帮忙吗?

编辑

感谢您的所有回复。我很欣赏并理解你所说的。由于在 google 和 here 上搜索,我已经放置了额外的 (),并且被多次建议。

这是一个 Devextreme 应用程序。上面的代码在我的 dxView 文件的随附 js 文件中,如下所示:

   <pre>   <div data-options="dxView : { name: 'Customer', title: 'Customer' } " >
<div  data-options="dxContent : { targetPlaceholder: 'content' } " >

    <div class="autocomplete" data-bind="dxAutocomplete: {
            dataSource: gridDataSourceConfiguration,
            displayExpr: 'Description',
            placeholder: 'Enter Customer Name',
            itemTemplate: 'item'
            }">


        
       </div>

    <div class="apply-filter-option">Apply Filter <div id="useFilterApplyButton"></div></div>
<div id="gridContainer"></div>
<div class="options"><div id="filterRow"></div></div>

    </div>


    </div></pre>

这段代码是设置一个具有信息和过滤功能的datagridview。

【问题讨论】:

  • 脚本末尾的 () 怎么办?必须要有吗?
  • 你在很多我不明白为什么的地方都有()。当你想调用一个函数时使用它们。在某些地方,您在声明对象后拥有它们:{ //Some stuff...}()。那可能是导致错误的原因?不过不确定。
  • 我建议您使用syntax validator,但它表示您的代码是有效的。

标签: jquery knockout.js devextreme


【解决方案1】:

您的代码不起作用,因为您混合了两种不同的方式:MVVM 和 jQuery-way。

默认的 DevExtreme 应用程序基于 MVVM 方法(通过knockoutjs)。因此,我建议您将所有小部件选项移至视图模型。

视图模型应如下所示:

Mobile.Customer = function(params) {

    var gridDataSourceConfiguration = [{
        "InternalID": 1,
        "Code": 'TEST 1',
        "Name": 'Test 1 Test 1'
    },
    {
        "InternalID": 4,
        "Code": 'TEST 2',
        "Name": 'Test 2 Test 2'
    },
    {
        "InternalID": 5,
        "Code": 'TEST 3',
        "Name": 'Test 3 Test 3'

    }];

    var applyFilterTypes = [{
        key: "auto",
        name: "Immediately"
    }, {
        key: "onClick",
        name: "On Button Click"
    }];

    var dataGridOptions = {
        dataSource: gridDataSourceConfiguration,
        filterRow: {
            visible: ko.observable(true),
            applyFilter: ko.observable("auto")
        },
        searchPanel: {
            visible: true,
            width: 240,
            placeholder: 'Search...'
        },
        headerFilter: {
            visible: true
        },
        columns: [{
            dataField: "InternalID",
            width: 30,
            caption: "ID"
        }, {
            dataField: 'Name',
            alignment: 'right'
        }, {
            dataField: "Code",
            alignment: 'right'
        }
        ]
    };

    var selectBoxOptions = {
        items: applyFilterTypes,
        value: ko.observable(applyFilterTypes[0].key),
        valueExpr: "key",
        displayExpr: "name"
    };

    var checkBoxOptions = {
        text: "Filter Row",
        value: ko.observable(true)
    };

    var applyFilterVisible = ko.observable(true);

    selectBoxOptions.value.subscribe(function(value) {
        dataGridOptions.filterRow.applyFilter(value);
    });

    checkBoxOptions.value.subscribe(function(value) {
        $("#gridContainer").dxDataGrid("instance").clearFilter();
        dataGridOptions.filterRow.visible(value);
        applyFilterVisible(value);
    });

    var viewModel = {
        gridDataSourceConfiguration: gridDataSourceConfiguration,
        selectBoxOptions: selectBoxOptions,
        checkBoxOptions: checkBoxOptions,
        dataGridOptions: dataGridOptions,
        applyFilterVisible: applyFilterVisible
    };

    return viewModel;
};

为了检查某些小部件值何时更改,我使用了 ko.observableko.subscribe 函数。

现在,我们可以更新视图了:

<div data-options="dxView : { name: 'Customer', title: 'Customer' } " >
    <div  data-options="dxContent : { targetPlaceholder: 'content' } " >
       <div class="autocomplete" data-bind="dxAutocomplete: {
            dataSource: gridDataSourceConfiguration,
            displayExpr: 'Description',
            placeholder: 'Enter Customer Name',
            itemTemplate: 'item'
            }">
        </div>
        <div class="apply-filter-option" data-bind="visible: applyFilterVisible">
            Apply Filter
            <div id="useFilterApplyButton" data-bind="dxSelectBox: selectBoxOptions"></div>
        </div>
        <div id="gridContainer" data-bind="dxDataGrid: dataGridOptions">
        </div>
        <div class="options"><div id="filterRow" data-bind="dxCheckBox: checkBoxOptions"></div></div>
    </div>
</div>

【讨论】:

    【解决方案2】:

    需要您提供更多信息,但这里修复了您的一些错误..

    1) 你有很多多余的 () (它会立即调用你的函数)它们不应该出现在 2) 你也没有声明 Mobile 所以不能附加一个属性到它 3) 看起来你在用 viewModel 做一些狡猾的事情,但不知道更多我不能确定

    var Mobile = {};
    Mobile.Customer = (function () {
        var viewModel = {};
    
        return {
            viewModel: viewModel
        };
    
        var gridDataSourceConfiguration = [{
            "InternalID": 1,
            "Code": 'TEST 1',
            "Name": 'Test 1 Test 1'
        },
        {
            "InternalID": 4,
            "Code": 'TEST 2',
            "Name": 'Test 2 Test 2'
        },
        {
            "InternalID": 5,
            "Code": 'TEST 3',
            "Name": 'Test 3 Test 3'
    
        }];
    
        var dataGrid = $("#gridContainer").dxDataGrid({
            dataSource: gridDataSourceConfiguration,
            filterRow: {
                visible: true,
                applyFilter: "auto"
            },
            searchPanel: {
                visible: true,
                width: 240,
                placeholder: 'Search...'
            },
            headerFilter: {
                visible: true
            },
            columns: [{
                dataField: "InternalID",
                width: 30,
                caption: "ID"
            }, {
                dataField: 'Name',
                alignment: 'right',
                //dataType: 'date'
            }, {
                dataField: "Code",
                alignment: 'right',
                // format: "currency"
            }]
        }).dxDataGrid('instance');
    
        var applyFilterTypes = [{
            key: "auto",
            name: "Immediately"
        }, {
            key: "onClick",
            name: "On Button Click"
        }];
    
        $("#useFilterApplyButton").dxSelectBox({
            items: applyFilterTypes,
            value: applyFilterTypes[0].key,
            valueExpr: "key",
            displayExpr: "name",
            onValueChanged: function (data) {
                dataGrid.option("filterRow.applyFilter", data.value);
            }
        });
    
        $("#filterRow").dxCheckBox({
            text: "Filter Row",
            value: true,
            onValueChanged: function (data) {
                dataGrid.clearFilter();
                dataGrid.option("filterRow.visible", data.value);
                $(".apply-filter-option").css("display", data.value ? "block" : "none");
            }
        });
    })();
    

    【讨论】:

    • 谢谢大家的建议。我已经编辑了我原来的问题以包含更多信息
    • 使用我回答中的编辑代码,您遇到什么错误?
    • 您能否为我们设置一个jsfiddle.net 来提供帮助(将其精简到重现它所需的最低限度)- 不确定在无法调试的情况下我能提供多少帮助
    猜你喜欢
    • 2011-12-26
    • 2021-04-07
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2013-02-26
    • 2014-11-18
    相关资源
    最近更新 更多