3

我不清楚我应该如何使用 sammyjs 从外部 API 加载 json。

这段代码很好用:

this.get('#/contact', function(context) {
       this.load('somefile.json')
      .then(function(items) {
            $.each(items, function(i, item) {
              context.log(item);
            });
        });

    });

但是,通过 http 加载的相同 json 失败:

this.get('#/contact', function(context) {
       this.load('http://samedomain/api/getdata')
      .then(function(items) {
            $.each(items, function(i, item) {
              context.log(item);
            });
        });

    });

通过 http 加载时,sammy 不再将 json 视为对象,并且似乎将数据解析为文本。

只是让每个人都清楚这不是域访问的问题。

 header('Access-Control-Allow-Origin: *');

我也不认为这是我的 json 格式的问题,因为它在作为本地文件加载时似乎工作正常。

我的rest api也在使用:

"Content-Type: application/json;

更新: 我把它放在 wordpress 中使用,并在此处列出它,以防它帮助其他人

(function($) {    
var app = $.sammy('#main', function() {
    this.use('Template');

     this.helpers({
            loadJSON: function(location, options, callback) {
                options = $.extend(options, {json: true});
                return new Sammy.RenderContext(this).load(location, options, callback);
            }
        });


    this.get('#/', function(context) {
        this.loadJSON('http://localhost/wp-somesite/wp-admin/admin-ajax.php?action=get_all_cases')
            .then(function(items) {
                $.each(items, function(i, item) {
                  context.log(item);
                });
            });
      });

    });

$(function() {
    app.run('#/');
});

})(jQuery);

4

2 回答 2

6

除了 VoDurden 所说的,您还可以传递显式设置 dataType 的加载选项。如果您查看Github 上的 Sammy Load 函数,您会发现它只是 ajax 调用的包装器。

尝试这样的事情:

loadOptions =   {
                type: 'get', 
                dataType: 'json',
                data: {query: variable},
            };

context.load("http://path.com/api/", loadOptions);
于 2012-07-29T16:15:52.867 回答
2

问题在于 sammy.js 如何确定它正在检索的数据类型。当您加载“mydata.json”时,.json 告诉 sammy.js 这是 JSON 数据,但是在加载“'http://samedomain/api/getdata'”时它假定它只是纯文本数据。

我不知道最好的方法是什么,但两种可能的解决方案是更改路由或使用 this.json(...) 将加载的项目转换为 JSON,如下所示:

this.get('#/contact', function(context) {
   this.load('http://samedomain/api/getdata')
  .then(function(items) {
        $.each(this.json(items), function(i, item) {
          context.log(item);
        });
    });

});

确保您的应用程序已使用 this.use(Sammy.JSON) 加载 JSON 库,并且 JSON 插件已加载到您的脚本定义中。

编辑: 另一种选择是您可以编写一个知道加载 JSON 的自定义函数,这是您可以使用的示例插件:

Sammy.JSON.LoadJSON.js:

(function($) {
    Sammy.JSON.LoadJSON = function(app) {
        app.helpers({
            loadJSON: function(location, options, callback) {
                options = $.extend(options, {json: true});
                return new Sammy.RenderContext(this).load(location, options, callback);
            }
        });
    }
})(jQuery);

应用程序.js:

this.use(Sammy.JSON.LoadJSON);

var app = $.sammy('#mytag', function() {
    this.get('#/contact', function(context) {
        this.loadJSON('http://samedomain/api/getdata')
        .then(function(items) {
            $.each(items, function(i, item) {
                context.log(item);
            });
        });
    });
});
于 2012-07-28T08:41:26.957 回答