2013-12-19 60 views
8

我知道{{}}可以解釋的表情,但是當我嘗試它使用JavaScript,它並不像{{"a/b/c/d/".split('/').filter(function(n){return n}).reverse()[0]}}如何使用JavaScript在{{}} AngularJS

工作,我需要用它來從網址獲得slug值。

請建議如何使用angularjs來實現此目的,url的來源是來自外部feed,因此我對此有非常有限的控制。

+1

很好的問題.. 。我想要什麼。 –

+2

您最好將它嵌入到模型的函數中,比如'getSlug()'並像'{{item.getSlug()}}'一樣使用它。這是更一致的方式 – oxfn

+2

你不能,你不應該。查看[Angular Expressions vs. JS Expressions](http://docs.angularjs.org/guide/expression),或者至少你不能指望任何的javascript只是工作。 * ...另一方面,如果您確實想運行任意JavaScript代碼,則應該將其設爲控制器方法並調用該方法。如果你想eval()從JavaScript的角度表達式,使用$ eval()方法。* – Yoshi

回答

7

完全JS不支持,甚至它是,這將是一個不好的做法。

我建議你至少把它放在控制器的示波器功能中。
更妙的是把它放在一個服務或過濾器,所以如果你想以後重新使用它作其他用途,您可以:

$scope.getSlug = function(str) { 
    return str.split("/").filter(function(n) { 
    return n; 
    }).reverse()[ 0 ]; 
}; 

,然後在你的模板:

{{ getSlug("a/b/c/d/") }} 
{{ getSlug(myModelProperty) }} 

此外,它是有效的閱讀Angular docs about expressions

+0

但我怎麼會在{{}}上使用html? – whizcreed

+0

編輯包括它 – gustavohenke

+1

布拉沃..正是我在找什麼.. muchas gracias ..阿米戈:D – whizcreed

2

{{}}告訴Angular在你看來,你有一個Expression插值。 Angular表達式不支持所有的JavaScript。有關文檔check here

如果你需要所有的JavaScript。將邏輯封裝在控制器功能中更好。從文檔

摘錄:

這可能是很有誘惑力的思考角度視圖表達式爲 JavaScript表達式,但是這並不完全正確,因爲 角不使用JavaScript的eval()計算表達式。你 可以把角表達式作爲JavaScript表達式與 以下區別:

屬性評價:所有屬性的評價是對 範圍做了評價,不像在JavaScript中,其中 是針對全球的窗口評估的表達式。

赦:表達的評價是寬容到undefined和null, 不像在JavaScript中,在試圖評估未定義的屬性 可以產生的ReferenceError或類型錯誤。

無控制流聲明:您無法在 中使用以下任何一種角度表達式:條件,循環或throw。

5

你不應該使用那樣的模板 - 所以Angular不支持它。無論是在範圍之內創建一個功能:

$scope.getSlug = function (input) { 
    return input.split('/').filter(function(n){return n}).reverse()[0]; 
} 

或者創建一個過濾器,做你想要什麼acheive:

angular.module('myModule').filter('myFilter', function() { 

    return function (input) { 
     if (!input) return input; 

     return input.split('/').filter(function(n){return n}).reverse()[0]; 
    }; 
}); 

而且使用這樣的:

<div>{{"a/b/c/d" | myFilter}}</div>