AngularJS $ রিসোর্স RESTful উদাহরণ


145

আমি আমার রেস্টস্টুল ওয়েব সার্ভিসে কল করতে $ সংস্থান ব্যবহার করতে চাই, (যা আমি এখনও কাজ করছি) তবে আমি আমার AngularJS লিপিটি প্রথমে সঠিকভাবে পেয়েছি কিনা তা খুঁজে বের করতে চাই।

টুডো ডিটিওতে রয়েছে: {id, order, content, done}

:cmdতাই আমি api/1/todo/resetডাটাবেসে টুডো টেবিলটি সাফ করতে কল করতে পারি ।

আমার বোঝার মন্তব্যে কোডটি এখানে:

function TodoService($resource) {
    var src = $resource('api/1/todo/:id:cmd',
              {id: "@id", cmd: "@cmd"}, //parameters default
              {
                ListTodos: { method: "GET", params: {} },
                GetTodo: { method: "GET", params: { id: 0 } },                            
                CreateTodo: { method: "POST", params: { content: "", order: 0, done: false } },
                UpdateTodo: { method: "PATCH", params: { /*...*/ } },
                DeleteTodo: { method: "DELETE", params: { id: 0 } },
                ResetTodos: { method: "GET", params: { cmd: "reset" } },
              });

    //Usage:

    //GET without ID
    //it calls -> api/1/todo
    src.ListTodos();

    //GET with ID
    //it calls -> api/1/todo/4
    src.GetTodo({ id: 4 });

    //POST with content, order, done
    //it calls -> api/1/todo
    src.CreateTodo({ content: "learn Javascript", order: 1, done: false });

    //UPDATE content only
    //it calls -> api/1/todo/5
    src.UpdateTodo({ id: 5, content: "learn AngularJS" }); 

    //UPDATE done only
    //it calls -> api/1/todo/5
    src.UpdateTodo({ id: 5, done: true });

    //RESET with cmd
    //it calls -> api/1/todo/reset
    src.ResetTodos();
}

একটি নির্দিষ্ট বিষয় যা আমি নিশ্চিত নই তা হচ্ছে প্যাচচ পদ্ধতি, আমি সবকিছু আপডেট করতে চাই না, আমি কি কেবল একটি ক্ষেত্র আপডেট করতে পারি? আমি কি এই টুকরা কোডটি সঠিকভাবে তৈরি করছি?


2
দেখে মনে হচ্ছে আপনি $ সংস্থানটি একটি বেসিক $ এইচপি পরিষেবা হিসাবে ব্যবহার করছেন। ST রিসোলফুল ডেটা উত্স থেকে কোনও অবজেক্ট পাওয়ার, এটিকে হেরফের করে, তারপরে এটিকে ফেরত পাঠানোর জন্য রিসোর্স হ'ল obj.save()। আপনি একটি বেসিক $ http বাস্তবায়ন দিয়ে যা করতে চাইছেন তা করতে পারেন।
বেন লেশ

4
@blesh যখন তিনি তার আরএসটিফুল ওয়েবসার্চির সাথে যোগাযোগ করতে চান তখন কেন তিনি $ সংস্থান ব্যবহার করবেন না? যেমনটি আপনি বলেছেন, এটি কি ঠিক এটির উদ্দেশ্য নয়?
এফ Lekschas

এটি আমার সন্ধান করছে তবে আমি $ সংস্থানটিকে পরিষেবা হিসাবে সংজ্ঞায়িত করব এবং এটি ইনজেক্ট করব। এটি আপনাকে যদি প্রয়োজন হয় তবে পরে এটি অন্য কোথাও সহজেই পুনরায় ব্যবহার করতে দেয়।
এফ Lekschas

4
@Flek ওয়েল, তিনি পারবেন না $ HTTP মত $ রিসোর্স ব্যবহার করেন তিনি চায় করতে। তবে এটি বাস্তবে কীভাবে ব্যবহার করা উচিত ছিল তা নয়।
বেন লেশ

3
ওয়েল, এটি আসলে কোনও "সমস্যা" নয়, প্রতি কথা বলে। এটি আরও বেশি যে তিনি বিশ্রামের এপিআই এবং $ রিসোর্সটি আপনার জন্য বাক্স থেকে বের করে দিতে পারে এমন সমস্ত স্টাফের কোনও সুবিধা নিচ্ছেন না।
বেন লেশ

উত্তর:


211

$ রিসোর্স বলতে বোঝানো হয়েছিল একটি শেষ পয়েন্ট থেকে ডেটা পুনরুদ্ধার করা, এটিকে পরিচালনা এবং এটিকে আবার প্রেরণ করা। আপনি সেখানে কিছু পেয়েছেন , তবে এটি যা করা হয়েছিল তার জন্য আপনি সত্যিই এটি উপকার করছেন না।

আপনার সংস্থানটিতে কাস্টম পদ্ধতিগুলি রাখা ভাল, তবে আপনি এটি শীতল বৈশিষ্ট্যগুলি মিস করতে চান না এটি OOTB এর সাথে আসে।

সম্পাদনা : আমি মনে করি না যে আমি $resourceএটির মূলত যথেষ্ট ভাল ব্যাখ্যা করেছি, তবে ফিনারের সাথে কিছু মজার স্টাফও করেছি। Todo.get()এবং Todo.query()উভয় রিসোর্স অবজেক্টটি ফিরিয়ে দেয় এবং কখন সম্পূর্ণ হবে তার জন্য কলব্যাকে এটি পাস করে । এটি পর্দার পিছনে প্রতিশ্রুতি সহ কিছু অভিনব স্টাফ করে যার অর্থ আপনি কলব্যাকটি প্রকট $save()হওয়ার আগে কল করতে পারেন get()এবং এটি অপেক্ষা করবে will কোনও প্রতিশ্রুতি then()বা কলব্যাক পদ্ধতির অভ্যন্তরে আপনার সংস্থানটি মোকাবেলা করা ভাল ।

স্ট্যান্ডার্ড ব্যবহার

var Todo = $resource('/api/1/todo/:id');

//create a todo
var todo1 = new Todo();
todo1.foo = 'bar';
todo1.something = 123;
todo1.$save();

//get and update a todo
var todo2 = Todo.get({id: 123});
todo2.foo += '!';
todo2.$save();

//which is basically the same as...
Todo.get({id: 123}, function(todo) {
   todo.foo += '!';
   todo.$save();
});

//get a list of todos
Todo.query(function(todos) {
  //do something with todos
  angular.forEach(todos, function(todo) {
     todo.foo += ' something';
     todo.$save();
  });
});

//delete a todo
Todo.$delete({id: 123});

তেমনি, আপনি ওপিতে যা পোস্ট করেছেন সে ক্ষেত্রে আপনি কোনও রিসোর্স অবজেক্ট পেতে পারেন এবং তারপরে আপনার যে কোনও কাস্টম ফাংশনকে কল করতে পারেন (তাত্ত্বিকভাবে):

var something = src.GetTodo({id: 123});
something.foo = 'hi there';
something.UpdateTodo();

আমি যাওয়ার আগে OOTB বাস্তবায়ন নিয়ে পরীক্ষা করতাম এবং নিজের নিজস্ব আবিষ্কার করি। এবং যদি আপনি দেখতে পান যে আপনি এর ডিফল্ট বৈশিষ্ট্যগুলির কোনও ব্যবহার করছেন না $resource, আপনার সম্ভবত $httpএটি কেবল নিজেরাই ব্যবহার করা উচিত ।

আপডেট: কৌণিক 1.2 এবং প্রতিশ্রুতি

কৌণিক 1.2 হিসাবে, সংস্থানগুলি প্রতিশ্রুতিগুলি সমর্থন করে। তবে তারা বাকী আচরণ পরিবর্তন করেনি।

সাথে প্রতিশ্রুতি লাভ $resource , আপনাকে $promiseফেরত মূল্যে সম্পত্তিটি ব্যবহার করতে হবে ।

প্রতিশ্রুতি ব্যবহার করে উদাহরণ

var Todo = $resource('/api/1/todo/:id');

Todo.get({id: 123}).$promise.then(function(todo) {
   // success
   $scope.todos = todos;
}, function(errResponse) {
   // fail
});

Todo.query().$promise.then(function(todos) {
   // success
   $scope.todos = todos;
}, function(errResponse) {
   // fail
});

শুধু মনে রাখবেন যে $promise সম্পত্তিটি একই মানগুলির উপরে সম্পত্তি যা এটি উপরে ফিরে আসছিল। সুতরাং আপনি অদ্ভুত পেতে পারেন:

এগুলি সমতুল্য

var todo = Todo.get({id: 123}, function() {
   $scope.todo = todo;
});

Todo.get({id: 123}, function(todo) {
   $scope.todo = todo;
});

Todo.get({id: 123}).$promise.then(function(todo) {
   $scope.todo = todo;
});

var todo = Todo.get({id: 123});
todo.$promise.then(function() {
   $scope.todo = todo;
});

1
আমার ধারণা আমি এইভাবে আমার বক্তব্যটি পরিমার্জন করব: আপনি যদি $ উত্সের কোনও ওওটিবি বৈশিষ্ট্য ব্যবহার না করেন তবে আপনি কেবল প্রয়োজন নেই এমন অবজেক্ট এবং ফাংশন রেফারেন্স সহ স্মৃতি গ্রহণ করছেন। এতে কি কোনও ক্ষতি হচ্ছে? সম্ভবত না. তবে আপনি যদি কেবলমাত্র স্ট্যান্ডার্ড সিআরইউডি অপারেশন করছেন এবং $ রিসোর্স নেটো বৈশিষ্ট্যগুলি লাভ করছেন না তবে কেবলমাত্র just এইচটিপি ব্যবহার করা আরও দক্ষ হতে পারে।
বেন লেশ

5
ব্লেশ, এমন কোনও ডক্স আছে যা ওওটিবি কার্যকারিতা ছাড়িয়ে যায়? কৌণিক ডক্স বিভ্রান্ত করছে।
এরিক্রুচ

9
দুঃখের বিষয়, সত্যিই নেই। আমি কেবল গিটহাবে তাদের উত্সটি খনন করেছি।
বেন লেশ

2
না Todo.get({id: 123});একটি প্রতিশ্রুতি এবং না একটি সোজা হয়ে বস্তুর আসতে?
ইংগ ভ্যালস

1
সম্ভবত আপনি আমার প্রশ্নে আমাকে সহায়তা করতে পারেন: stackoverflow.com/questions/30405569/…
AJ_83

0

আপনি ঠিক করতে পারেন $scope.todo = Todo.get({ id: 123 }).get()এবং .query()কোনও উত্সে অবিলম্বে কোনও বস্তু ফিরিয়ে দিন এবং প্রতিশ্রুতির ফলাফলটি পরে পূরণ করুন (আপনার টেমপ্লেট আপডেট করতে)। এটা না একটি টিপিক্যাল প্রতিশ্রুতি যা আপনি কেন হয় একটি কলব্যাক বা $ প্রতিশ্রুতি সম্পত্তি ব্যবহার করতে যদি আপনি কিছু বিশেষ কোড আপনি কি কলটি পর মৃত্যুদন্ড কার্যকর চাই প্রয়োজন। আপনি যদি কেবলমাত্র এটি টেমপ্লেটে ব্যবহার করে থাকেন তবে কলব্যাকে এটি আপনার স্কোপকে অর্পণ করার দরকার নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.