AngularJS - 通过输入选项改变表达方式
我正在构建应用程序,其中的项目价格应以不同货币显示。对于购物车,我使用的是角度指令,NgCart,我需要传递每件商品的数量和价格。该指令具有隔离范围,因此我无法使用过滤器来切换货币,而是直接从范围中传递不同的价格。我只是可以传递指令中的一个范围的数据(来自name in names
的数据)。AngularJS - 通过输入选项改变表达方式
我想要做的是,当在输入选项元素中选择相应的选项时,显示的价格会发生变化,并且通过切换它,传递给指令的价格也会发生变化(到所选货币) 。我一直试图用ng-options来实现它,但有些东西不起作用。我的HTML是这样的:
<div ng-controller="myCtrl" ng-app="myApp">
<select ng-options="price.currency for price in names" ng-model="currency"></select>
<div ng-repeat="name in names">
The price of {{name.toy}} is {{name.price[0].amount}} {{name.price[0].symb}}
<ngcart-addtocart name="{{name.toy}}" price="{{name.price[0].priceUSD}}">
<p1>Add to Cart</p1>
</ngcart-addtocart>
<br>
<br>
</div>
</div>
而且我的控制器:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.names = [{
"toy": "Buzz Lightyear",
"price": [
{"currency":"usd","amount":199,"symb": "$"},
{"currency":"eur","amount": 179,"symb": "€"}
]
},
{
"toy": "Woody",
"price": [
{"currency":"usd","amount":179,"symb": "$"},
{"currency":"eur","amount": 169,"symb": "€"}
]
}];
});
你可以看到一个工作的jsfiddle提前here谢谢!
编辑:更新plunker与NG-车指令,剩下的问题是,与由尤利安提供的解决方案,我无法通过货币符号,因此我不能显示正确的单元。
您的代码有几个问题。
1.首先,您使用ngOptions
是不正确的。您使用
for price in names
,并因此从您的名称中获取每个对象的
price
,这是
{"toy": ..., "price": []}
对象。相反,我会建议你创建另一个变量,将持有的可用货币,例如:
$scope.currencies = [
{currency: 'usd', symb: '$'},
{currency: 'eur', symb: '€'}
];
2.您将无法获得更新的价格在你的指令,因为你总是被传递给它的第一个元素的价格:
price="{{name.price[0].priceUSD}}"
。相反,您需要根据所选货币动态获取它。对于这一点,你可以创建类似下面的一个功能,那会回报你给出的货币价格:
$scope.getPriceInCurrency = function (item, currency) {
var priceInCurrency = 0;
item.price.forEach(function(price) {
if (price.symb === currency) {
priceInCurrency = price.amount;
}
});
return priceInCurrency;
};
现在,当你显示的选项和要显示相应的价格,从上面使用的功能获得它:
The price of {{name.toy}} is {{getPriceInCurrency(name, currency)}} {{currency}}
又路过你的价值观的ngcartAddtocart
指令时,这些都在这里不需要你可以省略{{}}
括号。
这是您的小提琴的fork与一个工作示例。
祝你好运!
由于名称是一个数组对象,因此无论名称[0]还是名称[1],都会感到困惑。
<select ng-options="item.currency for item in names[1].price" ng-model="curr"></select>
因此,如果您为货币查找创建单独的数组,那么问题就解决了。
<select ng-options="item as item.currency for item in currencyLookup" ng-model="selected"></select>
$scope.currencyLookup=[
{"currency":"usd","symb": "$"},
{"currency":"eur","symb": "€"}
]
嗨,因为我用于购物车的指令ngcart-addtocart是孤立的,所以我只需要使用内容即可'name in names',因为它是我可以在指令中传递的唯一附加数据,因此我需要在不使用额外范围的情况下执行此操作。 – Joe82
谢谢您的回答中,“数字转换”工作正常的外部和指令内。但是我无法在指令中显示货币符号(因为'{{selectedCurrency}}'是一个在隔离指令之外的范围)。可以在指令中传递的唯一附加数据是从name中的name获取的数据,我想知道是否可以基于该数据显示货币符号(即,不使用$ scope.currencies ')。谢谢! – Joe82
@ Joe82使用原始帖子中的表单。只需提供第一个价目表,而不是所有项目:'ng-options =“price.currency对于价格名称[0] .price”' – iulian
不确定这是否是您的意思,我得到了转换工作,但两个项目显示相同的价格:http://jsfiddle.net/Joe82/zs3jyv39/3/ – Joe82