2016-04-26 36 views
1

我試圖創建一個自定義指令,選項作爲屬性傳遞。 我注意到,貨幣過濾器只適用於數字,如果僅用於某些字符串屬性,它不起作用。如果我嘗試使用具有字符串屬性的這個過濾器,它不會產生任何結果..是這樣嗎? 和我如何使用貨幣過濾器的字符串值,如果我想?

var app = angular.module('myApp', []); 
 

 
app.controller('defaultCtrl', ['$scope', function($scope) { 
 
    $scope.products = [ 
 
    { 
 
     name: "Apples", 
 
     category: "Fruits", 
 
     price: 1.20, 
 
     expiry: 10 
 
    }, { 
 
     name: "Bananas", 
 
     category: "Fruits", 
 
     price: 2.42, 
 
     expiry: 7 
 
    }, { 
 
     name: "Pears", 
 
     category: "Fruits", 
 
     price: 2.02, 
 
     expiry: 6 
 
    } 
 
    ]; 
 
}]); 
 

 
app.directive('unorderedList', function() { 
 
    return function(scope, element, attrs) { 
 
    var data = scope[attrs["unorderedList"]]; 
 
    if(angular.isArray(data)) { 
 
     var listElem = angular.element('<ul>'); 
 
     var propertyExpression = attrs["listProperty"]; 
 

 
     element.append(listElem); 
 

 
     for(var i = 0; i < data.length; i++) { 
 
     listElem.append(angular.element('<li>').text(scope.$eval(propertyExpression, data[i]))); 
 
     } 
 
    } 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myApp"> 
 
    <div id="wrapper" ng-controller="defaultCtrl"> 
 
    <div class="panel panel-default"> 
 
     <div class="panel-heading"> 
 
     <h3>Products</h3> 
 
     </div> 
 
     <div class="panel-body"> 
 
     <div unordered-list="products" list-property="price | currency"></div> 
 
     <div unordered-list="products" list-property="name | currency"></div> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div>

+0

你會期望貨幣返回蘋果,香蕉或梨?我認爲它工作正常。名稱的值都不能轉換爲貨幣。 –

+0

它只是一個測試用例,是的,它沒有意義與這些值..但我一般問了一個問題..值可能會改變 –

+0

是的,我明白這只是一個測試用例,但它是一個測試用例不會重複您所問的問題。無論如何,我只是複製了你提供了很多次的項目,並沒有看到性能問題。但是... –

回答

0

該過濾器的源代碼(currency)站作爲

currencyFilter.$inject = ['$locale']; 
function currencyFilter($locale) 
{ 
    var formats = $locale.NUMBER_FORMATS; 
    return function(amount, currencySymbol, fractionSize) 
    { 
     if (isUndefined(currencySymbol)) 
     { 
      currencySymbol = formats.CURRENCY_SYM; 
     } 

     if (isUndefined(fractionSize)) 
     { 
      fractionSize = formats.PATTERNS[1].maxFrac; 
     } 

     // if null or undefined pass it through 
     return (amount == null) 
      ? amount 
      : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).replace(/\u00A4/g, currencySymbol); 
    }; 
} 

現在對於formatNumber開始的代碼作爲跟隨

function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { 

    if (!(isString(number) || isNumber(number)) || isNaN(number)) return ''; 

angular.isNumber狀態s

確定引用是否爲數字。

這包括「特殊」號碼的NaN,正無窮和負無窮

因此,formatNumber(...)與蘋果和香蕉簡單地返回''(空字符串)

0

由於列表屬性未定義在@範圍內,它不會被評估。

因此,當你把它放在那裏:是的,你需要範圍。$ eval。

但是你可以把它改成:

list-property="{{price | currency}}" 

,並刪除範圍$ EVAL在你的指令。這應該工作。

相關問題