ホームページ >ウェブフロントエンド >jsチュートリアル >angularjsでページテンプレートのクリアを使用する方法
この記事では、angularjs でページ テンプレートをクリアする方法を紹介します。必要な友人は参考にしてください。
数日前のプロジェクトの立ち上げ中に、いくつかの新しい問題が発生しました。ページが切り替わると、前のページのテンプレートが時間内にクリーンアップされず、ページが重なる原因になります。この問題の原因は次のとおりです。ページ テンプレートのキャッシュ、つまり、前のページが終了するときに、ブラウザが前のページのテンプレートを時間内に消去しないため、新しいページが読み込まれると、古いページ テンプレートが残ったままになります。が存在するため、ページが重複してしまいます。
テンプレート キャッシュのクリアには、従来の HTML タグ設定のキャッシュのクリアに加え、angularJs の一部の設定のクリア、および angularJs のルーティング切り替えのクリアが含まれます
1 以下は従来のクリアです。ブラウザメソッド
HTMLmetaタグ設定クリアキャッシュ
<!-- 清除缓存 --><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" />
クリアフォーム一時キャッシュ
<body onLoad="javascript:document.formName.reset()">
2.ルートrou内のルーティングキャッシュをクリアします。設定、$httpProvider サービスを挿入し、$httpProvider サービスを構成し、ルーティング キャッシュをクリアします。
app.config(["$stateProvider","$urlRouterProvider",'$locationProvider','$httpProvider',function ($stateProvider, $urlRouterProvider,$locationProvider,$httpProvider) { if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.get = {}; } $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';}]);2. 乱数を使用する。乱数はキャッシュを回避する非常に良い方法です。つまり、リンク URL パラメーターの後に乱数 (通常はタイムスタンプ) を追加します。乱数と同じように、ランダムな時間を使用します。 3. 状態ルーティング設定で、キャッシュ設定項目を false に設定します。
.state("discountCoupon", { url: "/discountCoupon", templateUrl: "discountCoupon.html?" + new Date().getTime(), //随机数 controller: 'discountCoupon', cache: false, //cache配置}) .state("customerPhone", { url: "/customerPhone", templateUrl: "customerPhone.html?" + new Date().getTime(), //随机数 controller: 'customerPhone', cache: false, //cache配置})3. angularJs
のルート切り替えによりキャッシュがクリアされますangularJsのデフォルトのテンプレート読み込みはキャッシュされます。使用されるキャッシュサービスは$tempalteCacheであり、テンプレートリクエストを送信するサービスは$templateRequestであるため、前のページのテンプレートのクリア:
1. 各 $http リクエスト テンプレートが送信された後、$tempalteCache.remove(url) または $tempalteCache.removeAll を呼び出して、すべてのテンプレート キャッシュをクリアできます。$rootScope.$on('$stateChangeStart', //路由开始切换 function (event, toState, toParams, fromState, fromParams) { //路由开始切换,清除以前所有模板缓存 if (fromState.templateUrl !== undefined) { $templateCache.remove(fromState.templateUrl); // $templateCache.removeAll(); } }); $rootScope.$on('$stateChangeSuccess', //路由切换完成 function (event, toState, toParams, fromState, fromParams) { //路由切换成功,清除上一个页面模板缓存 if (fromState.templateUrl !== undefined) { $templateCache.remove(fromState.templateUrl); // $templateCache.removeAll(); } });2. $provide.decorator を使用してネイティブ $templateRequest (angularJs には $provide service $templateRequest: $TemplateRequestProvider が付属しています) サービスを書き換えます。 $TemplateRequestProvider サービスでは、$tempalteCache (本質的には angularJs の $cacheFactory サービス) サービスがデフォルトで使用されていることがわかります
this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) { function handleRequestFn(tpl, ignoreRequestError) { handleRequestFn.totalPendingRequests++;そして、テンプレートを取得するときに、$templateCache がデフォルトでキャッシュとして使用されます。取得したテンプレートデータを$templateCacheに保存します。
return $http.get(tpl, extend({ cache: $templateCache, transformResponse: transformResponse }, httpOptions)) ['finally'](function () { handleRequestFn.totalPendingRequests--; }) .then(function (response) { $templateCache.put(tpl, response.data); return response.data; }, handleError);したがって、キャッシュを無効にして、$templateRequest のソース コードから $tempalteCache を削除して、テンプレート キャッシュをクリアすることができます。ただし、フレームワークのソース コードを直接変更することは一般的に推奨されません。 関連する推奨事項:
スライスを使用して JS で配列メソッドをカプセル化する
jQuery でのクラスの加算と減算の操作について (コード付き)
以上がangularjsでページテンプレートのクリアを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。