'undefined' не является функцией (оценка 'Backbone.$(window).on('hashchange', this.checkUrl)')

Я пытаюсь настроить Router с помощью Backbone.js и получаю исключение в строке 1414 backbone.js 1.1.2.

Ошибка существует в Safari и Chrome:

[Error] TypeError: 'undefined' is not a function (evaluating 'Backbone.$(window).on('hashchange', this.checkUrl)')
start (backbone.js, line 1414)
(anonymous function) (index.html, line 27)

Вот файл index.html, строка 27 — это Backbone.History.start().

<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<head>
    <link rel="stylesheet" href="bootstrap.min.css">
</head>
<body>
    <div class="container">
    </div>
    <script src="../jquery.js"></script>
    <script src="../underscore.js"></script>
    <script src="../backbone.js"></script>
    <script src="../json2.js"></script>

</body>

<!-- BACKBONE -->
<script type="text/javascript">
    (function($) {
        var PageRouter = Backbone.Router.extend({
            routes: {
                '': 'index'
            }
        });
        var pageRouter = new PageRouter();
        pageRouter.on('index', function() {
            console.log('hey');
        });
        Backbone.history.start();
    })(jQuery)
</script>
</html>

Я не могу найти много ресурсов, чтобы помочь, и большинство ранее существовавших ресурсов подчеркивают выделение маршрутизатора, и я чувствую, что это реализовано правильно. Кроме того, я не думаю, что необходимо иметь коллекцию или модель, поскольку в настоящее время я только пытаюсь реализовать маршрутизацию. Любая помощь будет оценена по достоинству, спасибо.

** РЕДАКТИРОВАТЬ **

Я изменил порядок импорта скрипта на:

<script src="../underscore.js"></script>
<script src="../backbone.js"></script>
<script src="../jquery.js"></script>
<script src="../json2.js"></script>

и ошибка изменилась на TypeError: 'undefined' is not a function (evaluating 'Backbone.$(window)')

добавление точки останова к строке 1414 backbone.js указывает на то, что ошибка связана с оценкой this.checkUrl

checkUrl: function () { [native code] }
arguments: (...)
get arguments: function ThrowTypeError() { [native code] }
set arguments: function ThrowTypeError() { [native code] }
caller: (...)
get caller: function ThrowTypeError() { [native code] }
set caller: function ThrowTypeError() { [native code] }
length: 1
name: ""
__proto__: function Empty() {}
[[TargetFunction]]: function (e) {
[[BoundThis]]: Backbone.History
[[BoundArgs]]: Array[0]

способ, которым я настроил маршрутизатор, де-факто соответствует нескольким источникам, независимо от (function($){})(jQuery) и не знаю, как правильно назначить путь. использование # мне не помогло.


person aug2uag    schedule 19.04.2014    source источник
comment
как насчет того, чтобы поставить точку останова в этой строке кода?   -  person Stephen Thomas    schedule 20.04.2014
comment
backbone.js показывает: Local{docMode:undefined, fragment:, frame:undefined, loc:undefined, oldIE:null, options:undefined, this:Backbone.History{ _hasPushState:false, _wantsHashChange:true, _wantsPushState:false}}   -  person aug2uag    schedule 20.04.2014
comment
попытался передать параметры {pushState:true} и определить index: function() {} в extend, все вышеупомянутые результаты с Uncaught TypeError: undefined is not a function и не смогли найти решение из предыдущего сообщения stackoverflow.com/questions/7343357/   -  person aug2uag    schedule 20.04.2014
comment
В вашей версии Backbone есть Backbone.$? В вашем jQuery есть on?   -  person mu is too short    schedule 20.04.2014
comment
@muistooshort да, насколько я могу судить, создал gist: gist.github.com/aug2uag/11099133< /а>   -  person aug2uag    schedule 20.04.2014


Ответы (1)


Я заметил две вещи в вашем коде:

  1. #P2# <блочная цитата> #P3# #P4#
  2. #P5# <блочная цитата> #P6# #P7#

Я не могу воспроизвести ошибку, которую вы видите, но если я учту обе эти точки, все будет работать так, как ожидалось:

var PageRouter = Backbone.Router.extend({
    routes: {
        '': 'index'
    },
    index: function() {
        console.log('index');
    }
});
var pageRouter = new PageRouter();
pageRouter.on('route:index', function () {
    console.log('hey');
});
Backbone.history.start();

Демонстрация: http://jsfiddle.net/ambiguous/kt7L8/

person mu is too short    schedule 19.04.2014
comment
спасибо за исправление моего кода и за проверку того, что исходный код работает на вас, а также за добрый и щедрый ответ. есть та же проблема, которая сохраняется, и я получаю ту же ошибку, и только ошибка меняется, когда я изменяю порядок импорта исходных сценариев. - person aug2uag; 20.04.2014
comment
Есть ли шанс воспроизвести проблему на jsfiddle.net или jsbin.com? Было бы легче заметить, если бы я мог видеть, как это происходит. - person mu is too short; 20.04.2014
comment
да, файл работает на jsfiddle, его можно увидеть на jsfiddle.net/aug2uag/cgwGr - person aug2uag; 20.04.2014
comment
хотите верьте, хотите нет, но код не будет работать для меня с активами js и отлично работает с импортом исходного кода из cdnjs. я не знаю, что, возможно, несоответствие версий, но придерживаюсь cdnjs. Спасибо за вашу помощь! - person aug2uag; 20.04.2014
comment
также json2 был не нужен - person aug2uag; 20.04.2014