jquery Widget - 未捕获的TypeError:Object [object Object]没有方法

时间:2013-04-26 07:14:52

标签: 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: {

        },

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

我的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>

如何解决此问题

1 个答案:

答案 0 :(得分:2)

有多个错误:

  • 最重要的是设置命名空间,在当前情况下,我在名称前面使用了自定义。所以你的情况应该是: $.widget('custom.koSpreadSheet');
  

目前存在一个限制,即必须使用一个名称空间。 [ Learn JQuery]

  • 请注意初始化过程,这样您就不会得到未定义的变量。变量我在调试时遇到问题:
    • data
    • Equationlhs
    • html
    • list
    • head

我刚用默认值&amp;初始化了所有内容。使它们全局可用,但你应该对它们的初始化过程进行细粒度控制。

以下是基于您的代码的working example