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 の形式に問題があるとは思いません。

私の残りのAPIも使用しています:

"Content-Type: application/json;

更新: これをワードプレスで使用し、他の誰かに役立つ場合に備えてここにリストします

(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 はこれが JSON データであることを sammy.js に伝えますが、"'http://samedomain/api/getdata'" をロードすると、プレーン テキスト データであると想定されます。

最善のアプローチが何であるかはわかりませんが、ルーティングを変更するか、読み込まれたアイテムを this.json(...) のように使用して JSON に変換することが 2 つの解決策として考えられます。

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);

app.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 に答える