0

我想知道是否有使用 Sammy.js 经验的人有使用跨域资源共享的解决方案?

编辑

最初的问题基本上只是询问人们可能使用什么方法来使用 Sammy.js 完成 CORS,例如覆盖 .load() 方法或类似的方法。

我遇到的问题是,在尝试与位于不同域(启用 CORS 的 sinatra 应用程序)上的 Sinatra api 交互时使用 .load() 方法时,事情没有按预期工作。

如果我使用 Ajax 调用,例如:

this.get('#/', function(context) {
    $.ajax({
      url: 'http://localhost:4567/posts', //located on other domain
      dataType: 'json',
      success: function(items) {
        $.each(items, function(i, item) {
          context.log(item.title);
        });
      }
    });
});

... firebug 在控制台中显示项目/帖子,但如果我使用 .load,例如:

this.load('http://localhost:4567/posts')

.then(function(items) {
   $.each(items, function(i, item) {
        context.log(item.title);
   });
});

... 一切都不是很好,萤火虫控制台显示http://pastie.org/4051256虽然萤火虫也表明 json 帖子数组已成功检索。

如果我尝试在模板中呈现项目而不是记录,也会发生这种行为:

this.load('http://localhost:4567/posts')
.then(function(items) {
   $.each(items, function(i, item) {
     context.render('tmpl/item.mustache', {item: item})
     .appendTo(context.$element());
   });
 });

...请记住,返回是一个只有三个帖子的 json 数组,模板已成功加载,但没有注入任何数据,并且它的呈现次数与上述粘贴中的“未定义”行数相同:(

编辑 2

sammy.js 中的.load方法如何将此调用与 jquery ajax 调用区别对待?

或者

为什么会出现上述问题?

4

1 回答 1

0

您需要在请求中添加预期的响应类型。否则,响应将作为字符串导入,同时看起来像 Firebug 中的数组/对象。您的标准 jQuery 方法有效,因为您已经这样做了:

dataType: 'json',

使用 .load() 方法,可以像这样指定预期的响应类型:

this.load('http://localhost:4567/posts', {dataType: 'json'})

或者像这样:

this.load('http://localhost:4567/posts', {json: true})

如果您的资源的 URL 名称中包含“json”,sammy.js 将自动将预期的响应类型设置为 JSON。这也是 sammy.js 网站上的示例有效的原因。

于 2012-08-07T00:52:24.800 回答