Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干.模型:将集合设置为属性_Backbone.js_Backbone Model - Fatal编程技术网

Backbone.js 主干.模型:将集合设置为属性

Backbone.js 主干.模型:将集合设置为属性,backbone.js,backbone-model,Backbone.js,Backbone Model,我是新来的有骨气的人,面临以下问题。我试着模仿一些有很多关系的人。为了实现这一点,我将添加以下代码来初始化模型中的方法: defaults: { name: '', tags: [] }, initialize: function() { var tags = new TagsCollection(this.get('tags')); tags.url = this.url() + "/tags"; return this.set('tags', tags, { si

我是新来的有骨气的人,面临以下问题。我试着模仿一些有很多关系的人。为了实现这一点,我将添加以下代码来初始化模型中的方法:

defaults: {
  name: '',
  tags: []
},
initialize: function() {
  var tags = new TagsCollection(this.get('tags'));
  tags.url = this.url() + "/tags";
  return this.set('tags', tags, {
    silent: true
  });
}
如果我通过集合获取模型,这段代码非常有效。据我所知,第一个集合获取数据,然后这个集合用这些数据填充模型。但当我尝试加载单个模型时,我的属性会被普通Javascript数组覆盖

m = new ExampleModel({id: 15})
m.fetch() // property tags get overridden after load
答复:

{
  name: 'test',
  tags: [
     {name: 'tag1'}, 
     {name: 'tag2'}
  ]
}
有人知道怎么解决这个问题吗

还有一个问题。是否有办法检查模型是否已加载。是的,我知道我们可以向fetch方法添加回调,但是像model.isLoaded或model.isPending这样的东西呢

谢谢

当我尝试加载单个模型时,我的属性会被普通Javascript数组覆盖

您可以重写该方法以保持集合被覆盖:

parse: function(attrs) {

    //reset the collection property with the new
    //tags you received from the server
    var collection = this.get('tags');
    collection.reset(attrs.tags);

    //replace the raw array with the collection
    attrs.tags = collection;

    return attrs;
}
有没有办法检查模型是否已加载

您可以将模型与其默认值进行比较。如果模型处于默认状态(保存其id),则不会加载该模型。如果没有,则加载:

isLoaded: function() {

    var defaults = _.result(this, 'defaults');
    var current  = _.wíthout(this.toJSON(), 'id');

    //you need to convert the tags to an array so its is comparable
    //with the default array. This could also be done by overriding
    //Model#toJSON
    current.tags = current.tags.toJSON();

    return _.isEqual(current, defaults);
}
或者,您可以钩住请求、同步和错误事件,以跟踪模型同步状态:

initialize: function() {
    var self = this;

    //pending when a request is started
    this.on('request', function() {
        self.isPending = true;
        self.isLoaded = false;
    });

    //loaded when a request finishes
    this.on('sync', function() {
        self.isPending = false;
        self.isLoaded = true;
    });

    //neither pending nor loaded when a request errors
    this.on('error', function() {
        self.isPending = false;
        self.isLoaded = false;
    });
}

1删除此之前的返回。设置,有关更多信息,请阅读1.1.0节。2 model.isLoaded-不确定是否存在,此属性是否应标记为已获取完成或其他内容?您好,谢谢您的评论。1我已经从coffeescript生成的initialize方法中删除了return,但它当然不能帮助我解决问题。你完全理解我。我的意思是一些方法,可以帮助我了解模型是否被获取。你能不能附上代码,你是如何加载单个模型的,看起来我明白了原因是什么。2i可以基于同步事件提供model.isLoaded实现,如果您有兴趣感谢您的回复。现在,当我获取一个模型时,它可以工作,但不适用于集合。有点奇怪的是,当集合首先创建模型时,它调用parse方法,然后调用initialize方法。所以,当我通过集合获取模型时,我无法访问属性标记,因为它尚未初始化。