2017-04-05 18 views
-1

我正在使用Angularjs 1.5。Angularjs 1.5 ng控制器<head>標籤

創建一個服務來處理META數據和頁面標題。 試圖應用它。

的問題是 - 由於某種原因,如果我直接在<head>標籤定義一個控制器:

<head ng-controller="headMetaController">

控制器將根本不會被加載,但如果我把它包在附加<div> withing的<head>

<head> 
<div ng-controller="headMetaController"> 
    <title ng-bind="seoMetaService.title()"></title> 
    <meta name="description" content="{{ seoMetaService.metaDescription() }}"> 
    <meta name="keywords" content="{{ seoMetaService.metaKeywords() }}"> 
<div> 
</head> 

=>它的工作原理。

所以,我想它以某種方式連接,尤其是<head>標記=>不確定,解決它的正確方法是什麼? 我也擔心把元數據放在額外的<div>之內可能對於搜索引擎優化目標來說不是個好主意嗎?

+0

你正在做什麼? – Ved

+1

將'ng-controller'移動到''標籤。你將在該標籤上同時具有'ng-app'和'ng-controller'。 – Lex

回答

1

首先,我認爲<div>不是<head>標籤內的有效標籤,因爲該標籤僅用於元數據,腳本,樣式以及其他不打算顯示的內容。其次,即使您像這樣調用控制器,但並不意味着您可以訪問head標記中的控制器變量。只有服務/工廠可以在head標籤內調用。

因此,而不是從head標籤調用從html標籤或標籤body或身體標記

+0

好的,感謝'div'。關於控制器的 - 如果我在'head'標籤上使用它,它不會被初始化。 'html'標記 - 我有另一個控制器那裏的全局功能.. – user1935987

+0

控制器頭標記實際上沒有得到初始化。這就是爲什麼我們不使用控制器來使用服務來訪問頭標中的數據。你可以在主體標籤內嵌入控制器。 –

+0

控制器 - 清楚,謝謝。 但我怎麼可以直接在html中使用服務,而沒有控制器作爲中間件? googling顯示我必須綁定一個服務介紹控制器的$ scope變量。 – user1935987

1

裏面如果你關心搜索引擎優化控制器調用它,你將不得不從另一個角度接近這個。

<div><head>內部無效外,在<meta>值上使用插值是一個紅旗。關心這些標籤的抓取工具將不會看到它們 - 相反,他們會看到{{ seoMetaService.metaKeywords()}},這對SEO顯然不利。

解決方案A:渲染服務器端的這些值。解決方案B:保留您擁有的內容,但要指示抓取工具在不同的位置訪問您的頁面。添加<meta name="fragment" content="!">,並允許您呈現的頁面的快照在其他地方居住,並在?_escaped_fragment_=添加到URL時投放。您可以將此部分委派給像prerender.io或類似的服務,該服務將掃描並存儲您的頁面。

+0

'{{ seoMetaService.metaKeywords()}}'但這種事情是假設被渲染的,而不是?據我瞭解,谷歌現在部分支持js框架,不是嗎? – user1935987

+0

https://webmasters.googleblog.com/2014/05/understanding-web-pages-better.html – user1935987

+0

絕大多數情況下,爬行元數據的漫遊器和抓取工具都不會運行javascript。例如,如果您在Facebook上的分享框中粘貼了該網站的網址,則會顯示「{{foo.title}}」。 – couzzi