Sammy.js + Mustache在简单示例中给出错误:haystack.indexOf不是函数

时间:2011-09-13 12:29:24

标签: jquery mustache sammy.js

大家好,并提前感谢您抽出时间。

我正在尝试使用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网站上获取了sammy和mustache文件。

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是一个非常简单的Mustache模板。

它正确加载json,然后加载模板,但它接收一个Document实例。它将此Document实例传递给Mustache,后者需要一个String,因此它会失败haystack.indexOf is not a function因为haystack是Document而不是字符串。

我也尝试将searchForm.m更改为searchForm.txt并得到同样的错误。我正在使用最新版本的Firefox,处理file://网址。

然而,这个例子很简单,不应该失败;我哪里错了?

2 个答案:

答案 0 :(得分:2)

它似乎与最新的jQuery版本(1.6+)和它的浏览器实现有关。我正在使用最新版本的chrome浏览器(14.0.8 ....),并且由于某种原因,加载模板时成功回调返回一个Document对象,而Sammy框架的逻辑需要一个字符串。在jQuery的1.4.2版本中,此调用返回的类型在同一浏览器版本中为string类型。

穿过堆栈,我在Sammy.js的第1499行找到了问题:

dataType: is_json ? 'json' : null,

修复它为'text'替换null

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

我不确定这种改变是否正确。但我希望这些信息有用

答案 1 :(得分:1)

您的模板未正确加载,或者其他库正在传递对象而不是字符串。

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

导致同样的错误。