Question

When I try to Call my widget i get the error

Uncaught TypeError: Object [object Object] has no method 'koSpreadSheet' 

My plugin

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

My 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>

How to solve this issue

Was it helpful?

Solution

There are multiple errors:

  • The most important is to put a namespace, in the current situation I've used custom in front of the name. So your case it should be: $.widget('custom.koSpreadSheet');

There is currently a limitation that exactly one namespace must be used. [ Learn JQuery]

  • Be aware of the initialization process so you won't end up with undefined variables. Variables I had problems with while debugging:
    • data
    • Equationlhs
    • html
    • list
    • head

I just initialized everything with a default value & made them globally available, but you should have a fine grained control on their initialization process.

Here is the working example based on your code.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top