0

我的主干.js 应用程序遇到问题:我正在尝试从 JSON Web 服务获取数据,GET HTTP 请求成功(我查看了 chrome 的开发人员控制台)但主干获取触发了一个错误并且不更新模型。

您可以在这里查看代码: https ://github.com/tdurand/faq-app-client-mobile

您可以运行该应用程序并尝试在此处调试:http: //tdurand.github.com/faq-app-client-mobile/

JSON Feed 是这样的

[
    {
       "title":"Probleme ou Bug",
       "desc":"Pour les problemes ou les bugs rencontrés",
       "entries":[
           {
             "title":"testdqs",
             "desc":"testqsdqs"
           }
        ]
    }
]

我的收藏模型是:

var Categories = Backbone.Collection.extend({

url:"http://cryptic-eyrie-7716.herokuapp.com/faq/fr",

model:Category,

parse:function(response) {
    console.log("test")
    console.log(response);
    return response;
},

sync: function(method, model, options) {
    var params = _.extend({
        type: 'GET',
        dataType: 'jsonp',
        url: model.url,
        processData:false
    }, options);

    return $.ajax(params);
},

});

而我的观点:

var IndexView = Backbone.View.extend({

el: '#index',

initialize:function() {
    Categories.fetch({
        success: function(m,r){
          console.log("success");
          console.log(r); // => 2 (collection have been populated)
        },
        error: function(m,r) {
          console.log("error");
          console.log(r.responseText);
        }
    });
    Categories.on( 'all', this.render, this );
},

//render the content into div of view
render: function(){
  //this.el is the root element of Backbone.View. By default, it is a div.
  //$el is cached jQuery object for the view's element.
  //append the compiled template into view div container
  this.$el.html(_.template(indexViewTemplate,{categories:Categories}));
  //Trigger jquerymobile rendering
  $("#index").trigger('pagecreate');

  //return to enable chained calls
  return this;
}
});
return IndexView;

非常感谢你的帮助

4

2 回答 2

0

我发现了我的错误。

我的后端服务器(带有 play!框架)没有正确呈现 JSONP

如果有人有同样的问题,这是我现在用来做的代码。

    //Render JSONP
    if (request.params._contains("callback")) {

        Gson gson = new Gson();

        String out = gson.toJson(categoryJSON(categories,lang));

        renderText(request.params.get("callback") + "(" + out + ")");

     } else {

        renderJSON(categoryJSON(categories,lang));

     }
于 2012-09-26T18:26:36.543 回答
0

据我所知,您没有在任何地方创建您的集合的实例。Javascript 并不是真正面向对象的,它具有这种奇怪的函数作为类和prototype继承类型的交易,这可能会使来自 OO 世界的任何人感到困惑。

var Categories = Backbone.Collection.extend...

上面发生的事情是您使用您定义的对象(或字典)扩展了 BackboneCollection的(这是一个函数)原型属性。为了能够将此“类”实例化为对象,您需要使用new关键字。你不这样做,所以你调用了fetch'class'的函数Categories,这会产生意想不到的结果。

因此,在获取之前实例化您的集合:

initialize:function() {
    this.collection = new Categories(); // instantiate the collection

    // also set event handlers before producing events
    this.collection.on( 'all', this.render, this );

    this.collection.fetch({
        success: function(m,r){
          console.log("success");
          console.log(r); // => 2 (collection have been populated)
        },
        error: function(m,r) {
          console.log("error");
          console.log(r.responseText);
        }
    });
}

希望这可以帮助!

于 2012-09-24T10:52:22.790 回答