ฉันจะดึงโมเดลเดียวใน Backbone ได้อย่างไร


93

ฉันมีClockโมเดลใน Backbone:

var Clock = Backbone.Model.extend({});

/clocks/123ฉันพยายามที่จะได้รับตัวอย่างของการที่มีข้อมูลล่าสุดจาก บางสิ่งที่ฉันได้ลอง:

วิธีการระดับ "คลาส"

Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'

สร้างอินสแตนซ์แล้วเรียกfetchใช้:

c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified

คอลเลกชัน

ฉันพยายามสร้างAllClocksทรัพยากรคอลเลกชัน (แม้ว่าฉันจะไม่ได้ใช้สิ่งนี้ในหน้านี้)

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/

ฉันจะรับนาฬิกาที่สนับสนุน API เพียงเครื่องเดียวได้อย่างไร


IMHO เป็นของคอลเลกชัน บางอย่างเช่น Collection # fetchOne (id, callback)
Julian Maicher

คำตอบ:


26

แนวทางที่สองของคุณคือแนวทางที่ฉันใช้ ลองเพิ่มสิ่งต่อไปนี้ในรุ่นนาฬิกาของคุณ:

url : function() {
  var base = 'clocks';
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},

วิธีนี้จะถือว่าคุณได้ติดตั้งตัวควบคุมที่มีแฮชบังใน URL ของคุณเช่นhttp://www.mydomain.com/#clocks/123แต่ควรใช้งานได้แม้ว่าคุณจะยังไม่ได้ใช้ก็ตาม


3
มีวิธีหลีกเลี่ยงปัญหานี้ตามที่อธิบายไว้ในเอกสารประกอบ
Modelcloud.github.com/backbone/#Model-url

@makevoid ของคุณฉันไม่สามารถทำงานตามตัวอย่างที่คุณระบุไว้ในสคริปต์กาแฟหรือตัวอย่างในเอกสารประกอบได้ตัวอย่างของแอนดรูว์ใช้งานได้หรือไม่คุณสามารถระบุและยกตัวอย่างด้วย foo.url () ได้เสมอมันบอกฉันเสมอว่าไม่มี url ฟังก์ชัน
Roberto Alarcon

@makevoid ดูเหมือนว่าวิธีการที่คุณอ้างถึงจะใช้ได้ผลก็ต่อเมื่อมีการสร้างโมเดลในคอลเล็กชัน สังเกตคอลเลกชันใน[collection.url]/[id].
Steven Devijver

@makevoid คุณช่วยส่งลิงค์ที่ใช้งานได้ไหม น่าเสียดายที่ตอนนี้เสียตอนนี้
AlexNikolaev94

นี่คือลิงค์การทำงาน (พวกเขาย้าย doc! wow, 5 ปีผ่านไป, geez): backbonejs.org/#Model-url - @StevenDevijver ถูกต้อง
makevoid

137

ลองระบุurlRootในโมเดล:

จากเอกสาร:

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();

2
ซึ่งเป็นสิ่งที่ดี แต่บางครั้งคุณไม่ต้องการคืนสถานะโมเดล currentBook.set('id', 13423, {silent:true})หากคุณต้องการที่จะดึงข้อมูลรายการที่เฉพาะเจาะจงกับรูปแบบเดียวกันคุณสามารถทำชุดเงียบ: มันก็ใช้ได้เช่นกัน แต่ฉันไม่แน่ใจว่าทำไม:currentBook.id = 13423
SimplGy

1
@SimplGy ที่ใช้งานได้เนื่องจากmodel.idมีความหมายเหมือนกันกับmodel.attributes.id. หากคุณเรียกmodel.set('id')Backbone model.idจะตั้งค่าตามที่คุณระบุ และmodel.idเป็นสิ่งที่จะใช้เมื่อสร้าง URL เฉพาะรุ่น
Lambart

26

ฉันขอแนะนำเป็นการส่วนตัวโดยทำตามเอกสารวิธี Model # url

model = new Model(id: 1)
view = new View(model: model) 
collection = new Collection([model])
model.fetch()

ในคอลเลกชันของคุณอย่าลืมเพิ่ม URL คอลเลกชัน:

url: "/models"

และในฟังก์ชั่นเริ่มต้นของ View ของคุณทำ:

this.model.bind("change", this.render)

วิธีนี้กระดูกสันหลังจะทำการร้องขอ ajax โดยใช้ url นี้:

"/models/1"

โมเดลของคุณจะได้รับการอัปเดตและมุมมองที่แสดงโดยไม่ต้องแก้ไข Collection # url หรือ Model # urlRoot

หมายเหตุ: ขออภัยตัวอย่างนี้ออกมาในสคริปต์กาแฟ แต่คุณสามารถแปลเป็น js โดยเพิ่มคำสั่ง var


เห็นได้ชัดว่าสิ่งนี้ใช้ไม่ได้ อย่าแม้แต่โทรไปที่เซิร์ฟเวอร์เมื่อเรียกดึงข้อมูลในโมเดล (หรือคอลเลกชัน)
Ricardo Amores

สิ่งนี้ดูดี แต่คอลเลกชันจะดูอึดอัดในกรณีที่เราไม่ต้องการคอลเลกชันจริงๆ
Dingle

ฉันไม่สามารถใช้งานได้: this.model.get ('field') ดูเหมือนว่าโมเดลถูกสร้างขึ้นวัตถุย่อย
Muhaimin

1
this.model.bind ("change", this.render, this) ทำงานได้ดีสำหรับฉัน
dmi3y

1
@UlysseBN ใช่ (คือปี 2011) คุณสามารถเพิ่มคำสั่ง var {}ภายใน()'สำหรับออบเจ็กต์ที่ส่งผ่านและ;โฆษณาตัวเลือกที่ท้ายบรรทัด
makevoid

12
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();

เป็นผลให้คุณส่งคำขอ Ajax ในไฟล์

URL http://[domainName]/person/details/id 

และคุณได้รับการตอบกลับ JSON กลับมา

เอ็นโจอิอิอิ !!!


2
นี่คือทางออกเดียวกับ @Hernan
Brenden

0

... และทำสิ่งนี้หากคุณไม่ต้องการให้เครื่องหมายทับบนโมเดล urlRoot:

    url : function() {                        
        return this.urlRoot + this.id;
    },

0

คุณน่าจะเข้าถึงวัตถุผ่านคอลเลกชันและเก็บไว้ในคอลเลกชันตลอดเวลา นี่คือวิธีการ:

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});

var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()

2
คุณไม่ทราบว่า บางทีทั้งหมดที่เขาต้องการคือนาฬิกาเรือนเดียว สมมติว่าฉันต้องการนำเสนอไคลเอ็นต์ด้วย Model of a User record? เขาควรเข้าถึงคอลเล็กชันของผู้ใช้ทั้งหมดด้วยหรือไม่? บางครั้งคนในบ้านก็ต้องการคำแนะนำบางอย่างในขณะที่พยายามทำให้กรณีใช้งานเป็นส่วนตัว แค่ตอบ.
Adrian Bartholomew

0

ฉันต้องการใช้ RESTful url แต่ฉันไม่เข้าใจว่าเหตุใดจึงไม่สามารถเพิ่ม 'postId' ใน URL พื้นฐานได้

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());

จากนั้นฉันจะรู้หลังจากที่ตั้งค่า 'idAttribute' เป็น 'postId' ใน Model แล้วฉันจะได้ url ที่ถูกต้อง แบบนี้:

var PostModel = Backbone.Model.extend({
    idAttribute: 'postId',
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.