javascript - significado - ¿Cómo busco un único modelo en Backbone?
backbone view events (7)
Tengo un modelo de Clock
en Backbone:
var Clock = Backbone.Model.extend({});
Estoy tratando de obtener una instancia de eso que tenga la información más reciente de /clocks/123
. Algunas cosas que he intentado:
un método de nivel de "clase"
Clock.fetch(123)
// TypeError: Object function (){ ... } has no method ''fetch''
crear una instancia y luego invocar fetch
sobre ella:
c = new Clock({id: 123})
c.fetch()
// Error: A ''url'' property or function must be specified
Una colección
Traté de crear un AllClocks
colección AllClocks
(aunque no tengo ningún uso para tal cosa en la página):
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: ''/clocks/''
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/
¿Cómo obtengo un reloj respaldado por API?
... y haga esto si no desea la barra inclinada posterior en el modelo urlRoot:
url : function() {
return this.urlRoot + this.id;
},
Personalmente lo recomiendo, siguiendo la documentcloud.github.com/backbone/#Model-url
model = new Model(id: 1)
view = new View(model: model)
collection = new Collection([model])
model.fetch()
en su colección recuerde agregar la url de la colección:
url: "/models"
y en la función de inicialización de tu Vista hazlo:
this.model.bind("change", this.render)
De esta forma, la red troncal hará una solicitud de ajax usando esta URL:
"/models/1"
su modelo será actualizado y la vista procesada, sin modificar Collection # url o Model # urlRoot
Nota: disculpe que este ejemplo salió en coffee script, pero puede traducirlo fácilmente a js al agregar sentencias var
Probablemente deberías acceder al objeto a través de una colección y mantenerlo en la colección todo el tiempo. Asi es como se hace:
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: ''/clocks/''
});
var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()
Pruebe a especificar urlRoot en el modelo:
De los documentos:
var Book = Backbone.Model.extend({urlRoot : ''/books''});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
Quiero utilizar la URL RESTful, pero no pude entender por qué ''postId'' no se puede agregar a la url base.
var PostModel = Backbone.Model.extend({
urlRoot: ''getBlogPost'',
defaults: {
postTitle: "defaultTitle",
postTime: "1970-01-01",
postContent: "defaultContent",
postAuthor: "anonymous"
}
});
var post = new PostModel({
postId: 1
});
alert(post.url());
Entonces sé que solo después de configurar ''idAttribute'' como ''postId'' en Model, puedo obtener la url correcta. Me gusta esto:
var PostModel = Backbone.Model.extend({
idAttribute: ''postId'',
urlRoot: ''getBlogPost'',
defaults: {
postTitle: "defaultTitle",
postTime: "1970-01-01",
postContent: "defaultContent",
postAuthor: "anonymous"
}
});
Su segundo enfoque es el enfoque que he usado. Intente agregar lo siguiente a su modelo de Reloj:
url : function() {
var base = ''clocks'';
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) == ''/'' ? '''' : ''/'') + this.id;
},
Este enfoque asume que ha implementado controladores con hashbang en su URL como lo hace, http://www.mydomain.com/#clocks/123 , pero debería funcionar incluso si aún no lo ha hecho.
var Person = Backbone.Model.extend({urlRoot : ''/person/details''});
var myName = new Person({id: "12345"});
myName.fetch();
Como resultado, usted hace una solicitud de Ajax en el
URL http://[domainName]/person/details/id
y tienes la respuesta JSON de vuelta.
Enjoiiii !!!