webentwicklung-frage-antwort-db.com.de

JavaScript-Fehler: "ist kein Konstruktor"

Ich benutze Backbone.js zusammen mit Jquery und Underscore.js

Hier ist ein Teil meines Codes (er tut noch nichts). Das Merkwürdige ist, dass beim Anklicken der URL "/ # users" kein Fehler auftritt. Der Fehler tritt nur dann auf, wenn ich dann auf einen anderen Hash klicke und dann auf "/ # Benutzer" klicke. Hier ist ein Teil meines Codes. In der Zeile, in der der Fehler gegen Ende Users = new Users(); angezeigt wird, lautet der Fehler "Benutzer ist kein Konstruktor":

var User = Backbone.Model.extend({
    url: function(){return 'api/user/id/' + this.id;}
});

var Users = Backbone.Collection.extend({
    model: User,
    url: function(){return 'api/users';},
    initialize: function() {
    }
});

var UsersView = Backbone.View.extend({
    initialize: function() {
        this.users = this.options.users;
        this.render();
    },

    render: function() {
        _(this.users).each(function(){
        //  $('#app').append('here');
        });

        var template = _.template($('#usersTemplate').text());

        $(this.el).html(template({users: this.users}));
        $('#app').html(this.el);
    }
});

var UserView = Backbone.View.extend({
    initialize: function() {
        this.user = this.options.user;
        this.render();
    },

    render: function() {

        var template = _.template("hello {{user.name}}");

        $(this.el).html(template({user: this.user.toJSON()}));
        $('#app').html(this.el);
    }
});

var Controller = Backbone.Controller.extend({
    routes: {
        'dashboard' : 'dashboard',
        'users' : 'showusers'
    },

    showuser: function(id) {
        UserList.fetch({
            success: function(){
                new UserView({user: User});
            },
            error: function(){
                alert('an error of sorts');
            }
        });
    },

    showusers: function() {
        Users = new Users();
        Users.fetch({
            success: function(Users) {
                new UsersView({users: Users});
            },
            error: function() {
            }
        });
    },

    dashboard: function() {
        Users = new Users;
        Users.fetch({
            success: function() {
                new UsersView({users: Users});
            },
            error: function() {
            }
        });
    }
});

$(document).ready(function(){
    var ApplicationController = new Controller;
    Backbone.history.start();
});

das begleitende HTML, wenn Sie neugierig sind:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Administration Panel</title>

    <!-- Framework -->
    <script src="/javascripts/jquery.min.js"></script>
    <script src="/javascripts/underscore.min.js"></script>
    <script src="/javascripts/backbone.js"></script>

    <!-- Application -->
    <script src="/javascripts/application.js"></script>

    <script id="usersTemplate" type="text/x-underscore-template">
        asdf
    </script>

</head>
<body>

<div>
<a href="#dashboard">Dashboard</a>
<a href="#users">Users</a>
<a href="#products">Products</a>
<a href="#orders">Orders</a>
<a href="#pages">Pages</a>
<a href="#settings">Settings</a>
</div>

<div id="app"></div>

</body>
</html>
11
Matthew

new kann nur mit einer Funktion als Operand verwendet werden.

new {}  // Error: ({}) is not a constructor

Überprüfen Sie den Typ von Users im Kontext: Dies ist not eine Funktion, wenn diese Ausnahme ausgelöst wird.

Glückliche Kodierung


alert(typeof(Users)) sollte den Trick tun. Das Ergebnis sollte "function" sein, um als Konstruktor verwendet zu werden. Beachten Sie, was im fehlerhaften Fall der Fall ist, und sehen Sie unten einen Grund.

Ein problematisches Szenario (für Users = new Users) kann Folgendes sein: Ein Objekt wird aus der Funktion Users erstellt, und dann wird das Objekt (jetzt keine Funktion/Konstruktor) wieder Users zugewiesen, sodass der nächste new Users kaboom! (Siehe sowohl showusers als auch dashboard - ist dieses Verhalten wirklich beabsichtigt?)

Der 'richtige' Code ist wahrscheinlich: var users = new Users; users.blahblah(...); Verwenden Sie also eine neue lokale Variable und nicht überschreiben die globale Benutzer-Variable Eigenschaft.


Der Fehler wird nur dann generiert, wenn "#foobar" (a/- Fragment Identifier ) zurückgegangen wird, weil tatsächlich keine neue Seite geladen wird und daher das JavaScript nicht neu geladen wird und der aktuelle (jetzt beschädigte Users) ist verwendet werden. kaboom!

Auszug aus Fragmentkennung :

Wenn sich das Zielelement im aktuellen Dokument befindet, kann ein Benutzeragent das Zielelement einfach fokussieren, ohne es neu laden zu müssen.

22
user166390

Ich denke, es ist ein Syntaxfehler 

dies geschah bei mir, als ich versuchte, in meiner Funktion return anonymous object zu __en 

 var FalsEextension=false;
 ........
 ........
 return new  { FalsEextension, LargeFile };// wrong Syntax 

und die korrekte Syntax lautet

 return { FalsEextension, LargeFile };

und du kannst es so benutzen

ObjectName.FalsEextension
0