Javascript jquery小部件-未捕获类型错误:对象[Object]没有方法

Javascript jquery小部件-未捕获类型错误:对象[Object]没有方法,javascript,jquery,json,widget,jquery-widgets,Javascript,Jquery,Json,Widget,Jquery Widgets,当我尝试调用我的小部件时,我得到了错误 Uncaught TypeError: Object [object Object] has no method 'koSpreadSheet' 我的插件 (function ($) { //Create spreadsheet app $.widget('koSpreadSheet', { //Default values for options options: { },

当我尝试调用我的小部件时,我得到了错误

Uncaught TypeError: Object [object Object] has no method 'koSpreadSheet' 
我的插件

(function ($) {

    //Create spreadsheet app
    $.widget('koSpreadSheet', {
        //Default values for options
        options: {

        },

        //Call Constructor
        _create: function () {
            this._CreateTable();
        },

        //Function to Render Table
        _CreateTable: function () {
            $.each(data.info[0], function (key, value) {
                console.log(data.info[0]);
                if ($.isNumeric(value)) {
                    if (jQuery.inArray(key, Equationlhs) === -1) {
                        html += "<td><input type='text' class='numericData' data-bind='value:" + key + "'></td>";
                        head += "<th class='variableHeading header-row' id= '" + key + "' title='Click to bind Equation'>" + key + "</th>";
                        list += "<li class='ui-state-default'>" + key + "</li>";
                    } else {
                        html += "<td><input type='text' class='numericData' readonly='readonly' data-bind='value:" + key + "'></td>";
                        head += "<th class='variableHeading header-row' id= '" + key + "' title='" + Equationlhs + "'>" + key + " (F)</th>";
                        list += "<li class='ui-state-default'>" + key + " (F)</li>";
                    }

                } else {
                    html += "<td><span data-bind='text:" + key + "'/></td>";
                    head += "<th class='header-row'>" + key + "</th>";
                }
            });

            var checklist = "<input type='checkbox' id='readonlyCheckbox'><span> Check to make fields ReadOnly</span></br>";
            checklist += "<input type='checkbox' id='viewonlyCheckbox'><span> Check for ViewOnly</span></br>";

            $("body").prepend(checklist);
            $("#div1 thead").append(head);
            $("#div1 tbody").append("<tr></tr>");
            $("#div1 tbody tr").append(html);
        }
    });
})(jQuery);
(函数($){
//创建电子表格应用程序
$.widget('koSpreadSheet'{
//选项的默认值
选项:{
},
//调用构造函数
_创建:函数(){
这是._CreateTable();
},
//函数来呈现表
_CreateTable:函数(){
$.each(data.info[0],函数(键,值){
console.log(data.info[0]);
如果($.isNumeric(值)){
if(jQuery.inArray(key,equalationlhs)=-1){
html+=“”;
头+=“”+键+“”;
列表+=“
  • ”+key+“
  • ”; }否则{ html+=“”; 头+=“”+键+“(F)”; 列表+=“
  • ”+键+“(F)
  • ”; } }否则{ html+=“”; 头+=“”+键+“”; } }); var checklist=“检查以使字段只读
    ”; 检查表+=“仅检查视图
    ”; $(“正文”)。预编(核对表); $(“#div1 thead”)。追加(标题); $(“#div1 tbody”)。追加(“”); $(“#div1 tbody tr”).append(html); } }); })(jQuery);
    我的HTML

    <html>
    
        <head>
            <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js"></script>
            <script src="knockout.mapping-latest.js"></script>
            <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
            <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
            <script src="testPlugin.js"></script>
            <script type="text/javascript">
                $(document).ready(function () {
    
                    var data = {
                        "info": [{
                                "Name": "Noob Here1",
                                "Department": "Language",
                                "Sex": "Male",
                                "Basic_Salary": "300000",
                                "ESI": "58",
                                "Employee_PF": "60.50",
                                "Bonus": "2.60",
                                "Salary": "0",
                                "Tax": "0",
                                "Gross_Salary": "0"
                            }
                        ]
                    }
                    var EquationData = {
                        'eqn': [{
                                'Salary': 'Basic_Salary - ( ESI * .5 ) - Employee_PF + Bonus',
                                'Tax': '( Salary < 200000) ? 0: (( Salary < 300000) ? (.15* Salary ) : ( Salary * .30))',
                                'Gross_Salary': '( Salary - Tax )'
                            }
                        ]
                    }
    
                    EquationData = EquationData["eqn"][0];
    
                    $.each(EquationData, function (lhs, rhs) {
                        Equationlhs.push(lhs);
                    })
    
                    $('#div1').koSpreadSheet();  //koSpreadSheet is name of widget
    
                    $(document).tooltip();
    
                });
            </script>
        </head>
    
        <body>
            <table id="div1">
                <thead></thead>
                <tbody data-bind="foreach: info"></tbody>
            </table>
        </body>
    
    </html>
    

    
    $(文档).ready(函数(){
    风险值数据={
    “信息”:[{
    “名称”:“Noob Here1”,
    “部门”:“语言”,
    “性别”:“男性”,
    “基本工资”:“300000”,
    “ESI”:“58”,
    “员工薪酬”:“60.50”,
    “奖金”:“2.60”,
    “薪资”:“0”,
    “税”:“0”,
    “工资总额”:“0”
    }
    ]
    }
    var方程数据={
    “eqn”:[{
    “工资”:“基本工资-(ESI*.5)-员工工资+奖金”,
    “税”:工资<200000?0:((工资<300000)?(.15*工资):(工资*.30)),
    ‘薪金总额’:‘薪金税’
    }
    ]
    }
    EquationData=EquationData[“eqn”][0];
    $。每个(等式数据、函数(左侧、右侧){
    等式左推(左推);
    })
    $('#div1').koSpreadSheet();//koSpreadSheet是小部件的名称
    $(document.tooltip();
    });
    

    如何解决此问题

    存在多个错误:

    • 最重要的是在名称前面放一个名称空间,在当前的情况下,我使用了custom。因此,您的案例应该是:
      $.widget('custom.koSpreadSheet')
    目前有一个限制,即只能使用一个名称空间

    • 注意初始化过程,这样就不会出现未定义的变量。调试时遇到问题的变量:
      • 数据
      • 等式lhs
      • html
      • 列表
      • head
    我只是用一个默认值初始化了所有东西&使它们全局可用,但是您应该对它们的初始化过程有一个细粒度的控制


    以下是基于您的代码的名称。

    为什么我们将自定义放在小部件名称之前?这是您名为koSpreadSheet的插件的名称空间。显然jQuery现在只允许1个名称空间。