Sammy.js + Mustache выдает ошибку в простом примере: haystack.indexOf не является функцией

Привет всем и заранее спасибо, что нашли время.

Я экспериментирую с Sammy.js + Mustache. Итак, я создал HTML-файл, который включает в себя все, что там должно быть:

<html>
    <head>
        <script type="text/javascript" src="jquery-1.6.3.js"></script>
        <script type="text/javascript" src="sammy.js"></script>

        <script type="text/javascript" src="mustache.js"></script>
        <script type="text/javascript" src="sammy.mustache.js"></script>

        <script type="text/javascript" src="application.js"></script>
    </head>
    <body>
        <div id="main">

        </div>

    </body>
</html>

Я взял файлы сэмми и усов с их сайтов на github.

В application.js есть просто:

$(function() {
    var app = $.sammy('#main', function() {

        this.use('Mustache','ms');

        var search = {};

        this.get('#search', function() {
            var ctx = this;
            ctx.load('data/server.json')
                .then(function(server) {
                    ctx.render('searchForm.ms', server);
                });
        });
    });

    app.run();
});

searchForm.ms — это очень простой шаблон для усов.

Он правильно загружает json, затем загружает шаблон, но получает экземпляр Document. Он передает этот экземпляр документа в Mustache, который вместо этого ожидает строку, поэтому он завершается ошибкой с haystack.indexOf is not a function, потому что стог сена — это документ, а не строка.

Я также попытался изменить searchForm.ms на searchForm.txt и получил ту же ошибку. Я использую последнюю версию Firefox, работаю с file:// URL-адресами.

Однако этот пример настолько прост, что не должен быть ошибочным; где я не прав?


person Simone Gianni    schedule 13.09.2011    source источник
comment
Получение той же ошибки с помощью Mustache и jquery. Не могли бы вы опубликовать содержимое шаблона searchForm.ms?   -  person Jonathan Hendler    schedule 14.09.2011


Ответы (2)


Кажется, это связано с последними версиями jQuery (1.6+) и реализацией браузера. Я использую последнюю версию браузера Chrome (14.0.8....), и по какой-то причине обратный вызов успеха при загрузке шаблона возвращает объект документа, в то время как логика для платформы Sammy ожидает строку. В версии 1.4.2 jQuery тип, возвращаемый этим вызовом, имеет тип строки в той же версии браузера.

Пройдясь по стеку, я обнаружил проблему в строке 1499 в Sammy.js:

dataType: is_json ? 'json' : null,

Исправление замены нуля на «текст»

dataType: is_json ? 'json' : 'text',

Я не уверен, что это изменение правильное. Но я надеюсь, что эта информация может быть полезной

person kohku    schedule 26.10.2011

Ваш шаблон загружается неправильно, или другая библиотека передает объект вместо строки.

Mustache.to_html({}, {}, {} );

Вызывает ту же ошибку.

person Jonathan Hendler    schedule 14.09.2011
comment
Да, как я уже сказал, потому что стог сена — это не строка, а документ. Я решил исправить Sammy.Mustache, чтобы проверить, считается ли он XMLDocument, и в случае его сериализации в строку. Однако я держал это открытым, потому что я полагаю, что я (мы) делаем что-то не так, но, возможно, в этот момент есть ошибка. - person Simone Gianni; 15.09.2011