このチュートリアルでは、動的SEOメタデータにこのサービスを使用しようとしました。 https://weluse.de/blog/angularjs-seo-finally-a-piece-of-cake.htmlSEOのメタデータを保存するためのAngularJSサービス
しかし、問題に直面する - サービスがコントローラのビューの外でアクセスできないようです。ここで<div ui-view></div>
は私が実装しようとしているサービスである:コントローラーで
app.service('SeoMetaService', function() {
var metaDescription = '';
var metaKeywords = '';
var title = '';
return {
metaDescription: function() { return metaDescription; },
metaKeywords: function() { return metaKeywords; },
title: function() { return title; },
reset: function() {
metaDescription = '';
metaKeywords = '';
title = '';
},
setMetaDescription: function(newMetaDescription) {
metaDescription = newMetaDescription;
},
appendMetaKeywords: function(newKeywords) {
for(var i=0;i<newKeywords.length;i++){
if (metaKeywords === '') {
metaKeywords += newKeywords[i];
} else {
metaKeywords += ', ' + newKeywords[i];
}
}
},
setTitle: function(newTitle) { title = newTitle; }
};
});
用法:
:簡素化メインページ(1ページアプリ)、上app.controller('WelcomeController',['$scope', 'SeoMetaService', function($scope, SeoMetaService) {
$(document).ready(function() {
var keywords = ["bla bla","bla bla blah"];
SeoMetaService.setTitle("title bla bla bla");
SeoMetaService.setMetaDescription("description bla bla bla");
SeoMetaService.appendMetaKeywords(keywords);
console.log(SeoMetaService.metaDescription());
console.log(SeoMetaService.metaKeywords());
});
}]);
<html ng-app="MainPage">
<head>
<title>{{SeoMetaService.title()}}</title>
<meta name="description" content="{{ SeoMetaService.metaDescription() }}">
<meta name="keywords" content="{{ SeoMetaService.metaKeywords() }}">
<base href="/">
</head>
<body>
<div ui-view></div>
</body>
したがって、の問題は -iです角度サービスはシングルトンであると考えていました。 しかし、コントローラを実行してデータを設定した後は、HTMLで表示されません。
どのように修正するか/何をすべきですか?
角度コントローラの中でjQuery( '$(document).ready()')を使用しないでください。あなたはそれを必要とせず、コントローラ内のどのような方法でもDOMとやりとりするべきではありません。 – deceze
どうしてですか?私は時々使う。 – user1935987
何のため?ドキュメント*は、コントローラが実行するまでに準備が整うため、余計です。そして、コントローラからDOMを操作しないでください。なぜなら、jQuery mushを書くことに戻るからです。Angularの中核的な強みの1つは、サービス/コントローラ/ビューへの厳密な分離です。これにより、アプリケーションを適切にモジュール化して保守性を高めることができます。途中で複雑なアプリケーションを作成し、それらを拡張して変更する必要があると、コントローラーをDOMに結びつけるとすぐに醜いスポットに遭遇します。 – deceze