【问题标题】:Backbone "new" Collection not creating new object骨干“新”集合不创建新对象
【发布时间】:2015-04-30 21:50:26
【问题描述】:

我正在构建一个使用 RequireJS 和 Backbone 的单页应用程序。 我有多个使用 Backbone 管理的数据端点。

我有一个构建 URL 的集合,并在获取 URL 之前将唯一 ID 附加到 URL。

集合是这样定义的:

define([
'underscore',
'backbone', 
'models/MyModel'
], function(_, Backbone, MyModel){
console.log('test'+id);
var Data = Backbone.Collection.extend({
  model: MyModel,
  url: '/getData/?id='+id,
  parse: function(response) {
    return response;
  }
});        

return Data;
});

它是这样使用的:

function retrieveData() {
require(['collections/MyData'],
    function(MyData) {
        // create model
        var data = new MyData(var:myVars});

        // fetch data
        data.fetch({async: false});

        //...
    }
);

}

一切都相当简单。 但是,我在创建模型时出现了问题。 URL 用来查询服务器的 Id 在后台发生变化,当它发生变化时我调用了retrieveData()。 在代码的第一遍创建模型,我已将其验证为“console.log('test'+id);”打印到控制台。 但是,当我再次调用 retrieveData() 时(在 id 更改后),执行代码以创建一个新模型,而不是创建一个新模型,Backbone 似乎从第一遍返回已经实例化的模型,因此 URL 不会使用新 ID 进行更新。 "console.log('test'+id);"由于未创建对象且未输入函数,因此不会首先在任何传递栏上打印到控制台。

我是否连接了某些东西,或者这里是否有某种缓存?

谢谢

【问题讨论】:

  • 你能清理一下你的示例代码吗?它现在的样子,它有语法错误,很难猜出实际代码是什么样的

标签: backbone.js


【解决方案1】:

您的问题似乎是您在创建集合原型时尝试创建id,但创建MyData 集合的代码只运行一次。

更好的方法可能是在实例化期间提供id

类似这样的:

define([
'underscore',
'backbone', 
'models/MyModel'
], function(_, Backbone, MyModel){
var Data = Backbone.Collection.extend({
  model: MyModel,
  initialize: function(options) {
    this.id = options.id;
  },
  url: function() {
    return '/getData/?id=' + this.id
  },
  parse: function(response) {
    return response;
  }
});        

return Data;
});

function retrieveData() {
require(['collections/MyData'],
    function(MyData) {
        // create model
        var data = new MyData({ var:myVars, id: id });

        // fetch data
        data.fetch({async: false});

        //...
    }
);

【讨论】:

  • 完美!这正是问题所在。谢谢,你不会相信我研究这个问题多久了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
相关资源
最近更新 更多