আমি কীভাবে ব্যাকবোনটিতে একটি একক মডেল আনব?


93

Clockব্যাকবোনটিতে আমার একটি মডেল রয়েছে:

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/

আমি কীভাবে কেবল একটি এপিআই-ব্যাকড ক্লক পাব ?


আইএমএইচও এটি সংগ্রহের অন্তর্ভুক্ত। সংগ্রহের মতো কিছু # ফেচওন (আইডি, কলব্যাক)।
জুলিয়ান মাইচার

উত্তর:


26

আপনার দ্বিতীয় পদ্ধতির ব্যবহারটি আমি ব্যবহার করেছি। আপনার ক্লক মডেলটিতে নিম্নলিখিতগুলি যুক্ত করার চেষ্টা করুন:

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

এই পদ্ধতির ধারণা ধরে নেওয়া হয়েছে যে আপনি আপনার ইউআরএলটিতে যেমন হ্যাশব্যাং দিয়ে কন্ট্রোলারগুলি প্রয়োগ করেছেন, http://www.mydomain.com/#clocks/123 , তবে এটি এখনও আপনার কাজ না করে থাকলেও কাজ করা উচিত।


4
ব্যাকবোন মডেল ডকুমেন্টেশনে ডকুমেন্টক্লাউড.
github.com/backbone/# মডেল- ইউআর

@ আপনার কৌতূহল আপনি কফি স্ক্রিপ্টে যে উদাহরণ সরবরাহ করেন বা ডকুমেন্টেশনের একটি, অ্যান্ড্রু উদাহরণটি কাজ করে, আপনি foo.url () দিয়ে উদাহরণ সরবরাহ করতে পারেন, এটি আমাকে সর্বদা বলে যে কোনও ফাংশন url নেই me
রবার্তো অ্যালারকন

@ মাকোভিয়েড মনে হচ্ছে যে পদ্ধতিটি আপনি উল্লেখ করছেন কেবল তখনই কাজ করে যদি মডেলটি কোনও সংগ্রহে তৈরি করা হয়েছে। সংগ্রহটি লক্ষ্য করুন [collection.url]/[id]
স্টিভেন দেবিজেভার

@ ম্যাকোভয়েড আপনি কি কোনও কাজের লিঙ্ক সরবরাহ করতে পারেন? দুর্ভাগ্যক্রমে, এটি
এখনের

এখানে কাজের লিঙ্কটি রয়েছে (তারা ডকটি সরিয়ে নিয়েছে! বাহ, 5 বছর কেটে গেছে, গীজ): backbonejs.org/# মডেল- ইউরাল - @ স্টিভেনডেভিভার সঠিক
মেকভয়েড

137

মডেলটিতে urlRoot নির্দিষ্ট করার চেষ্টা করুন :

ডক্স থেকে:

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

4
এটি ভাল, তবে কখনও কখনও আপনি মডেলটিকে পুনরায় জোর করতে চান না। আপনি একই মডেল বিরুদ্ধে কোন নির্দিষ্ট আইটেম আনতে চান, আপনি একটি নীরব সেট করতে পারেন: currentBook.set('id', 13423, {silent:true})। এটিও কার্যকর হয় তবে আমি কেন নিশ্চিত তা নিশ্চিত নই:currentBook.id = 13423
সিম্পলজি

4
@ সিম্পলজি যা কাজ করে কারণ model.idএটি মূলত সমার্থক model.attributes.id। আপনি যদি কল করেন model.set('id'), ব্যাকবোন model.idআপনার নির্দিষ্ট করে যা সেট করে সেট করে। আর model.idকি ব্যবহৃত পায় যখন মডেল-নির্দিষ্ট URL তৈরি হয়।
ল্যামবার্ট

26

মডেল # url পদ্ধতি ডকুমেন্টেশন অনুসরণ করে আমি ব্যক্তিগতভাবে সুপারিশ করি

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

আপনার সংগ্রহে সংগ্রহ url যুক্ত মনে রাখবেন:

url: "/models"

এবং আপনার ভিউয়ের আরম্ভের ফাংশনে করুন:

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

এইভাবে ব্যাকবোন এই ইউআরএলটি ব্যবহার করে একটি অজ্যাক্স অনুরোধ করবে:

"/models/1"

আপনার মডেলটি আপডেট হবে এবং ভিউ রেন্ডার্ড হবে, সংগ্রহ # ইউআরএল বা মডেল # urlRoot পরিবর্তন না করে

দ্রষ্টব্য: দুঃখিত, এই উদাহরণটি কফি স্ক্রিপ্টে প্রকাশিত হয়েছে, তবে আপনি সহজেই এর বিবরণ যুক্ত করে জেএস-এ অনুবাদ করতে পারেন


স্পষ্টতই এটি কাজ করে না। এমনকি মডেলটিতে আনতে (এমনকি সংগ্রহটি) কল করার সময় সার্ভারে কলও করবেন না
রিকার্ডো আমোরস

এটি দুর্দান্ত দেখায়, তবে যখন সংগ্রহের সত্যিকার অর্থে আমাদের সংগ্রহের প্রয়োজন হয় না তখন সংগ্রহের লাইনটি বিশ্রী দেখায়।
ডিংল

আমি এটি কাজ করতে পারি না: this.model.get ('ফিল্ড')। দেখে মনে হচ্ছে মডেলটি সাব অবজেক্ট তৈরি হয়েছে
মুহাইমিন

4
this.model.bind ("পরিবর্তন", this.render, এটি) আমার জন্য ভাল কাজ করেছে
dmi3y

4
@UlysseBN হ্যাঁ (বছর 2011 ছিল), আপনি Var বিবৃতি যোগ করতে পারেন, {}ভিতরে ()পাস বস্তু এবং ঐচ্ছিক 's ;লাইনের শেষ বিজ্ঞাপন
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 

এবং আপনার কাছে জেএসএন প্রতিক্রিয়া ফিরে এসেছে।

এনজয়ইইইই !!!


4
এটি @ হার্নান
ব্রেন্ডেন

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

4
আপনি এটা জানেন না। সম্ভবত তার প্রয়োজন কেবল একটি ক্লক। মনে করুন আমি কোনও রেকর্ডের একক মডেল সহ কোনও ক্লায়েন্টকে উপস্থাপন করতে চাই? তারও কি সমস্ত ব্যবহারকারীর সংগ্রহের অ্যাক্সেস থাকা উচিত? কখনও কখনও লোকেরা তাদের ব্যবহারের কেসটি ব্যক্তিগত রাখার চেষ্টা করার সময় কিছু পরামর্শ প্রয়োজন। শুধু উত্তর.
অ্যাড্রিয়ান বার্থোলোমিউ

0

আমি রেস্টস্টুল ইউআরএলটি ব্যবহার করতে চাই, তবে কেন বুঝতে পারি না কেন 'পোস্ট আইডি' বেস ইউআরএলে যুক্ত করা যায় না।

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

আমি তখনই জানি যে আমি মডেলটিতে 'পোস্টএডিবি' হিসাবে 'আইডিএট্রিবিউট' সেট করার পরে আমি সঠিক ইউআরএল পেতে পারি। এটার মত:

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.