2

私はbackbone.jsアプリケーションを既存のCodeigniterAPIに接続しようとしています。githubでtodosの例を見て、そこから構築しました。'read'で呼び出されるfindAll関数をオーバーライドし、ページを取得してフェッチ関数に戻そうとしています。

findAll:function(){console.log('synch --findAll');

var url = "/folio/get/8";
var data = ''; 

var postmethod = 'GET';

$.ajax({
    url : url,
    type : postmethod,
    async: false,
    data: data,
    success: function(response) 
    {
                    console.debug("response",response);
        console.debug("response.pages", response["pages"]);
        return _.values(response["pages"]);
    }
});

}

APIは次のようなものを返します-console.debug( "response"、response)を介して出力します。

{
    "id": "8",
    "facebook_id": "123456789",
    "title": "title",
    "access_date": null,
    "rating_avg": "0",
    "pages": [
        {
            "id": "6",
            "picture1": {
                "id": "3",
                "tag": "1",
                "tip": "Crazy",
                "facebook_picture_id": "1239102391023"
            },
            "picture2": "28",
            "picture3": "29",
            "picture4": null,
            "picture5": null,
            "picture6": null,
            "caption1": "caption 1",
            "caption2": "caption 2",
            "sequence": "2",
            "folio": "8",
            "ts": "2012-04-10 15:13:23",
            "template": "#page-template-2"
        },
        {
            "id": "5",
            "picture1": "24",
            "picture2": "25",
            "picture3": "26",
            "picture4": null,
            "picture5": null,
            "picture6": null,
            "caption1": "caption 1",
            "caption2": "caption 2",
            "sequence": "4",
            "folio": "8",
            "ts": "2012-04-10 15:13:23",
            "template": "#page-template-2"
        }
    ]
}

ただし、console.debug( "response.pages"、response ["pages"])は「undefined」を出力します。なぜそれをするのですか?

よろしくお願いします!

- - - - - - - - - - 編集 - - - - - - - - - - -

ご回答有難うございます。モデル内からajax呼び出しを実行できるヒントは非常に役立ちます。問題は、複数のページを1つのPageListコレクションにまとめようとしていることです。

$(function(){
  // Page Collection
  // ---------------

  var PageList = Backbone.Collection.extend({

    model: Page,
    localStorage: new Store("wickes-backbone"), // this to get hold of my overwritten localstorage file - it is not actually a localStorage

    nextOrder: function() {
      if (!this.length) return 1;
      return this.last().get('order') + 1;
    },

    comparator: function(page) {
      return page.get('order');
    }

  });

  window.Pages = new PageList;
});

したがって、appviewの初期化関数内で私は呼び出しています

Pages.fetch();

これにより、すべてのページにデータが入力され、ビューが更新されます。モデル自体の中でそれを行う方法が本当にわかりませんか?

4

3 に答える 3

1

あなたの問題は、$。ajax()でsuccess関数をどのように使用しているかにあると思います。

$.ajax({
    url : url,
    type : postmethod,
    async: false,
    data: data,
    success: function(response) 
    {
        console.debug("response",response);
        console.debug("response.pages", response["pages"]);
        return _.values(response["pages"]);
    }
});

AJAX呼び出しでsuccess関数から何かを返すと、それはビットバケットに直接入ります。その_.values()はどこにも向かっていません。$ .ajax()呼び出しから得られるのは、約束です。それだけです。そのpromiseには、後で.done()、. fail()などを添付できます。また、.when()やその他の目的で使用することもできます。ただし、後で呼び出す成功関数とは何の関係もありません。これは、そのpromiseに付加された.done()関数と同等です。

私の推測では、あなたが本当に望んでいるのは、AJAXが終了し、結果を操作して、モデルに設定することです。

ただし、一般的に、Backboneを強制的に同期させようとすることは、それが使用されることを意図した方法ではありません。バックボーンに組み込まれている同期を使用せず、フェッチや保存などをスキップする場合でも、そのように呼び出されても問題なく対応できます(モデルは、更新時に更新されるだけであることに注意してください。フェッチ):

var myModel = Backbone.Model.extend({
  goGetSomeData : function () {
    var scope = this;

    $.ajax(....).done(
      function (results) {
        scope.set(results);
      }
    );
  }
});
于 2012-04-13T15:34:58.103 に答える
1

これをPageListバックボーンコレクションに追加してみてください。

  parse: function(response) {
    return response.pages
  }

これは2つのことを行います:

  1. 応答で配列.pagesを参照するために使用します。pages私があなたのコードからわかることから、バックボーンは全体的なオブジェクト応答を使用してコレクション内のオブジェクトを決定しています。
  2. pages配列を使用してコレクション内のモデルをインスタンス化するようにバックボーンに指示します。これは、ネイティブparseメソッドをオーバーライドし、本当に必要なもの(ページ配列)を返すことによって行われます。

これ行うと、ページオブジェクトが1つのPageListコレクションになります。これは、同様の状況で私のために働いています。それが役に立てば幸い!

于 2012-04-13T16:48:47.487 に答える
0

さて、ここで実際に何がうまくいかなかったのかを解明しました。John Munschが最初の回答で述べたように、ajaxリクエストは完全に正しくありませんでした。これは実際にはバックボーンの問題ではありませんでしたが、私が行っていたajax呼び出しの問題でした。まず最初にそれをjsonに変更し、次にajax呼び出しの外に変数「pages」を作成しました。これは応答を記憶してsynch関数に返すことができます。

findAll: function() {

    var url = "/folio/get/8";
    var pages;
    var postmethod = 'GET';

    $.ajax({
         type: postmethod,
         url: url,
         async: false,
         beforeSend: function(x) {
          if(x && x.overrideMimeType) {
           x.overrideMimeType("application/j-son;charset=UTF-8");
          }
     },
     dataType: "json",
     success: function(data){
         console.debug("data", data);
         console.debug("data.pages", data.pages);
         pages = data.pages;

     }
    });

    return pages;

},

皆様のご協力に心より感謝申し上げます。回答から多くのことを学びました!

于 2012-04-13T23:14:29.997 に答える