অ্যাঙ্গুলারজেএস-এ কীভাবে রিফ্রেশ / অবৈধ $ রিসোর্স ক্যাশে


95

আমার কাছে একটি সাধারণ ব্যবহারকারী $ সংস্থান রয়েছে যা ডিফল্ট $ এইচটিপি ক্যাশে প্রয়োগের মতো ব্যবহার করে:

factory('User', function($resource){
    return $resource(endpoint + '/user/current/:projectId', {},
        {get: 
            {
                cache: true,
                method: 'GET'
            }
        }
    );
})

এটি খুব ভালভাবে কাজ করে, অর্থাত্ আমার অ্যাপ্লিকেশনটিতে আমার সার্ভারটি একবার কল করা হয়, তারপরে মানটি ক্যাশে থেকে আনা হয়।

তবে আমাকে একটি নির্দিষ্ট অপারেশনের পরে সার্ভার থেকে মানটি রিফ্রেশ করতে হবে। এটি করার কোন সহজ উপায় আছে?

ধন্যবাদ


4
আমি অস্থির ব্যবহার করছি (1.1.5 তবে আমি মনে করি এটি সেখানে 1.1.2 এর পরে আছে) cache- {boolean|Cache}- যদি সত্য হয় তবে একটি ডিফল্ট default
এইচটি পিএস

4
আমার একই সমস্যা হচ্ছে তবে পরীক্ষার সময়ই। আমি কীভাবে ব্রাউজার স্তরে এই জিনিসটিকে আবদ্ধ করব?
chovy

উত্তর:


117

বুলিয়ান রাখুন এবং $httpক্যাশে পান:

var $httpDefaultCache = $cacheFactory.get('$http');

তারপরে আপনি এটিকে তৈরির মতো অন্য কোনও ক্যাশের মতো $cacheFactoryব্যবহারের উদাহরণ হিসাবে নিয়ন্ত্রণ করতে পারেন :

$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)

52
নিখুঁত আপনাকে ধন্যবাদ! ঠিক আমি খুঁজছেন ছিল কি. যারা ভাবছেন তাদের জন্য, আপনি call cacheFactory.get ('$ HTTP') কল করতে পারেন।
আলেকজান্দ্রি বুল্তে

4
প্রকৃতপক্ষে আমি দেখতে পেয়েছি যে রিমুভ () কল করার সময় আমার যে কোনও প্রশ্নের প্যারামিটারের সাথে পূর্ণ url নির্দিষ্ট করা দরকার। আমি কি এখানে কিছু মিস করছি?
শ্যাঙ্গজিয়াও

4
আমার ডায়নামিক ক্যোয়ারী প্যারামিটার রয়েছে। $resourceকারখানা থেকে url অ্যাক্সেস করার কোনও উপায় আছে ?
সুজনশখ্যা

4
এটি কাজ করে। এটি প্রয়োজনের চেয়ে জটিলতা হতে পারে। এটি প্রয়োগ করা হলে এর থেকে আরও ভাল সমাধান হতে পারে: github.com/angular/angular.js/issues/9064
KFunk

5
আমার জন্য, $ cacheFactory.get ('$ http') remove সরানোর সমস্ত () কৌশলটি করেছে, কারণ আমার সমস্ত ক্যাশেড ডেটা সাফ করার দরকার ছিল।
এস বাগি

18

cacheপ্রত্যেকের সম্পত্তিতে বুলিয়ান যুক্তি ব্যবহার না করে actionআপনি $ ক্যাশেফ্যাক্টরি দিয়ে তৈরি ক্যাশে যা আপনি আরও নিয়ন্ত্রণ করতে পারেন (যেমন ক্যাশে সাফ করুন) দিয়ে যেতে পারেন।

ব্যবহারের উদাহরণ:

app.factory('Todos', function($resource, $cacheFactory) {
    var cache = $cacheFactory('todo');
    return $resource(apiBaseUrl + '/todos/:id', { id: '@id' }, {
        'get': { method: 'GET', cache: cache  },
        'query': { method: 'GET', cache: cache, isArray: true }
    });
});

ধন্যবাদ আমি এটিও দেখেছি, তবে আমি সেই পথে নামার আগে এটি করার জন্য একটি "আদর্শ"
উপায়ের সন্ধান করছিলাম

4
"কৌণিক উপায়ে" অনুসারে একটি খুব "মানক" পদ্ধতির মতো বলে মনে হচ্ছে :)
ভেরিয়েন্ট

4
তুমি ঠিক বলছো. আমি স্ট্যান্ডার্ড $ রিসোর্স ক্যাশে সহ একটি পদ্ধতির বোঝাতে চাইছিলাম।
আলেকজান্দ্রি বুল্তে

6

আমি এই থ্রেডটি জুড়ে একই রকম কিছু সন্ধান করতে এসেছি তবে খুঁজে পেয়েছি $ উত্স আপনার জন্য স্বয়ংক্রিয়ভাবে ক্যাশে পরিচালনা করবে, সুতরাং ক্যাশে সাফ করার জন্য বাধ্য করার দরকার নেই।

ধারণাটি হ'ল যদি আপনার কাছে এমন কোনও সংস্থান থাকে যা আপনি জিজ্ঞাসা করতে পারেন তবে সেই প্রশ্নের জবাব ক্যাশে হবে, তবে আপনি যদি সেই একই উত্সের জন্য কিছু সঞ্চয় করেন তবে পূর্ববর্তী ক্যাশেড ডেটা অবশ্যই অবৈধ হতে হবে, তাই এটি আপনার জন্য সাফ হয়ে গেছে। এটি বোঝায় যে এটি এইভাবে কাজ করবে।

এটি করার জন্য আমি এখানে কিছু কোড ব্যবহার করছি (আপনি সম্ভবত উদ্ভট ফ্যাক্টরি তৈরির অংশটিকে উপেক্ষা করতে পারেন এবং "শ্রেণি" বডিটিতে মনোযোগ দিতে পারেন)।

'use strict';

sampleApp.players.$ng.factory('sampleApp.players.PlayerService', [
    '$log',
    '$resource',
    sampleApp.players.PlayerService = function ($log, $resource) {
        var service = {};

        $log.info('Creating player resource.');
        var Player = $resource('/api/players', {}, {query: {
            isArray: true,
            cache: true,
            method: 'GET'
        }});

        service.addPlayer = function(playerName) {
            $log.info('Saving a new player.');
            return new Player({name: playerName}).$save();
        };

        service.listPlayers = function () {
            $log.info('Fetching players.');
            return Player.query();
        };

        return service;
    }]);

যদি আপনি তালিকা প্লেয়ারদের বেশ কয়েকবার ফাংশন কল করেন, প্রথম কলটি একটি HTTP অনুরোধ করে এবং পরবর্তী সমস্ত কল ক্যাশে হয়। যদি আপনি অ্যাডপ্লেয়ারকে কল করেন তবে কোনও HTTP পোস্ট প্রত্যাশিত হিসাবে সম্পাদিত হয় এবং তারপরে তালিকার প্লেয়ারগুলিতে পরবর্তী কল একটি HTTP get (ক্যাশেড নয়) সম্পাদন করবে।

এটি আপনাকে অন্য কারও ($ http) ক্যাশে পরিচালনা করার ব্যবসায়ের হাত থেকে বাঁচিয়ে রাখে এবং অনুরোধের জন্য কোন ইউআরএল ব্যবহার করা হয় এবং যা সঠিক সময়ে ক্যাশে সাফ করছে তা চালিয়ে যাওয়ার চেষ্টা করে।

আমি মনে করি যে গল্পটির নৈতিকতা এখানে লাইব্রেরির সাথে কাজ করা এবং সব কিছু ঠিকঠাক হবে ... কোনও বাগ বা অসম্পূর্ণ বৈশিষ্ট্য ব্যতীত, তবে কৌনিকটি এর কোনওটিই নেই;)

PS এগুলি সমস্ত অ্যাঙ্গুলারজেএস ১.২.০ এ চলছে


4
হ্যাঁ, আমি বুঝতে পেরেছি এবং স্বীকার করি যে "স্বাভাবিক" অবস্থার মধ্যে কৌনিক উত্স জানে কীভাবে এবং কখন ক্যাশেটিকে অকার্যকর করতে হয় এবং এটি পুরোপুরি কার্যকরভাবে কাজ করে। তবে আমার ব্যবহারের ক্ষেত্রে কিছুটা আলাদা ছিল: আমি একটি রিফ্রেশ জোর করতে চেয়েছিলাম কারণ অ্যাংুলারের জানার কোনও উপায় ছিল না যে রিফ্রেশ দরকার ছিল - ব্যবহারকারী বস্তুটি অ্যাংুলার অ্যাপের বাইরে পরিবর্তিত হচ্ছে।
আলেকজান্দ্রে বুল্তো

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

4
এটি মুছে ফেলার সাথে কাজ করার ক্ষেত্রে উপস্থিত হয় না। পরবর্তী কলটি আবার ক্যাশে থেকে টানবে এবং মুছে ফেলা আইটেমটি আবার প্রদর্শিত হবে। কেউ কি নিশ্চিত করতে পারবেন?
লুকাস

এই কাজ করবে না ngResource না হ্যান্ডল ক্যাশে অবৈধতা উদাহরণস্বরূপ এখানে যান stackoverflow.com/questions/25117388/...
HugoPoi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.