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
如何通过ID以外的东西获取Backbone.js模型?_Backbone.js - Fatal编程技术网

如何通过ID以外的东西获取Backbone.js模型?

如何通过ID以外的东西获取Backbone.js模型?,backbone.js,Backbone.js,js默认的RESTful方法通过ID获取模型是简单而直接的。但是,我似乎找不到任何通过不同属性获取模型的示例。如何通过不同的属性获取Backbone.js模型 var Widget = Backbone.Model.extend({ urlRoot: '/widgets', fetchByName: function(){ ... } }); var foowidget = new Widget({name: 'Foo'}); foowidget.fetchByName();

js默认的RESTful方法通过ID获取模型是简单而直接的。但是,我似乎找不到任何通过不同属性获取模型的示例。如何通过不同的属性获取Backbone.js模型

var Widget = Backbone.Model.extend({
    urlRoot: '/widgets',
    fetchByName: function(){ ... }
});
var foowidget = new Widget({name: 'Foo'});
foowidget.fetchByName();

一种方法是为所有类或仅为您的类重写主干.sync()方法。然而,您的目标大概是覆盖单个模型的fetch。一种方法是直接调用jQuery.ajax(…),成功后,获取响应并设置它,例如

fetchByName: function() {
   var self = this;

    $.ajax({
      url: self.urlRoot+ "?name="+this.get('name'),
      type: 'GET',
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function(data) {
          self.set(data);
      }
    });


}

如果模型是集合的一部分,则可以使用where()提取与某些条件匹配的模型


请参见

在调用fetch时,您可以在
基本模型
定义或按需执行类似操作

model.fetch({ data: $.param({ someParam: 12345}) });
在你的情况下,按照

var Widget = Backbone.Model.extend({
    initialize: function(options) {
        this.name = options.name;        
    },
    urlRoot: '/widgets',
    fetchByName: function(){ 
        this.fetch({ data: $.param({ name: this.name }) }) 
    }
});

var foowidget = new Widget({name: 'Foo'});
foowidget.fetchByName();

我非常喜欢“user645715”建议的方法。我已经调整了代码,使其更加通用。如果您将其添加到主干模型中,它将允许您通过一个或多个属性搜索服务器,并应作为
fetch
的直接插入式替代

fetchByAttributes: function(attributes, callbacks) {

    var queryString = [];
    for(var a in attributes){
        queryString.push( encodeURIComponent(a)+'='+encodeURIComponent(attributes[a]) );
    }
    queryString = '?'+queryString.join('&');

    var self = this;

    $.ajax({
        url: this.urlRoot+queryString,
        type: 'GET',
        dataType: "json",
        success: function(data) {
            self.set(data);
            callbacks.success();
        },
        error: function(data){
            callbacks.error();
        }
    });
}
它可以这样使用:

var page = new Page();
page.fetchByAttributes({slug:slug}, {
    success: function(){
        console.log('fetched something');
    },
    error: function(){
        console.log('nothing found');
    }
});

这是一个简单的模型。fetch在某种程度上与$.ajax相同

model = Backbone.Model.extend({
    urlRoot: "/root/"
});

var Model = new model();

Model.fetch({
    beforeSend: function () {
        console.log("before");
    },
    data: {
        param1: "param1",
        param2: "param2"
    },
    success: function () {
        console.log("success");
    },
    error: function () {
        console.log("failure");
    }
});

这是从服务器获取特定模型,还是从集合级fetch语句中选择已从服务器返回的多个模型之一?如果集合的大小合理,这种差异可能无关紧要,但如果模型非常大,则可能会有所不同。它不是通常属于集合的一部分的模型,因此在这种情况下不起作用。该名称在服务器上是唯一的吗?然后,您可以通过在模型中设置
idAttribute:'name'
来使用'name'作为id。然后正常取;但这是假设一个实例的端点是“/widgets/”。@PaulHoenecke我曾计划同时使用这两种方法,但知道这一点很好。谢谢您可能应该在
fetchByName
方法中返回
this.fetch(…)
,这样您就可以附加
。然后()
.done()
.fail()
回调它。绝对正确。我只是展示了如何使用不同的参数来实现。