使用angularjs ng选项和ng更改时发送选项对象

使用angularjs ng选项和ng更改时发送选项对象,angularjs,ng-options,angularjs-ng-change,Angularjs,Ng Options,Angularjs Ng Change,我有一个传递给ng选项的对象数组,该数组包含下一个模式中的货币对象: [{ "cur_iso": "ILS", "cur_symbol": "\u20aa", "cur_name_he": "\u05e9\u05e7\u05dc", "cur_rate_in_nis": "1.0000", }, { "cur_iso": "USD", "cur_symbol":

我有一个传递给ng选项的对象数组,该数组包含下一个模式中的货币对象:

[{
        "cur_iso": "ILS",
            "cur_symbol": "\u20aa",
            "cur_name_he": "\u05e9\u05e7\u05dc",
            "cur_rate_in_nis": "1.0000",
    }, {
        "cur_iso": "USD",
            "cur_symbol": "$",
            "cur_name_he": "\u05d3\u05d5\u05dc\u05e8",
            "cur_rate_in_nis": "3.8580"
    }]
我正在使用
ng选项
从此数组中进行选择

<select ng-model="bindCurrencyModel" ng-init="bindCurrencyModel='ILS'" 
ng-options="currency.cur_iso as currency.cur_symbol+' '+currency.cur_name_he for currency in currencies track by currency.cur_iso" 
                    ng-change="setCurrency(currency)">
</select>   
和set ng change=“setCurrency(currency)”但问题是我得到了:

   TypeError: Cannot read property 'cur_rate_in_nis' of undefined
另一个奇怪的行为是select开头的空行

查看我创建的所有代码


谢谢

我相信您的
setCurrency()
方法将无法访问
currency
,只能访问通常的范围变量。在这种情况下,可以使用
bindCurrencyModel
变量。

将ng选项更新为:

ng-options="currency as currency.cur_symbol+' '+currency.cur_name_he for currency in currencies track by currency.cur_iso"

这将使用setCurrency函数中所需的完整对象填充模型。

简短版本如下:

标记更改为以下内容:

<select ng-model="selectedCurrency" ng-init="selectedCurrency=currencies[0]" 
    ng-options="currency as currency.cur_symbol+' '+currency.cur_name_he for currency in currencies track by currency.cur_iso" 
    ng-change="setCurrency(selectedCurrency)">
</select>
$scope.setCurrency = function (currency) {
    $scope.bindRateModel = parseFloat(currency.cur_rate_in_nis);
    $scope.bindCurrencyModel = currency.cur_iso;
};
为什么这样做有效? 第一个区别是,我将整个
currency
对象绑定到一个新的
selectedCurrency
scope属性。这使您可以访问整个对象,而不仅仅是
cur\u iso
属性。这样,您就不必通过
货币
数组查找完整对象

然后我更改了
ngchange
表达式,使用绑定到的scope属性将整个对象传递到
$scope.setCurrency
。这允许该方法访问完整对象


最后,您需要在
$scope.setCurrency()
函数中设置
$scope.bindCurrencyModel
,这样它将恰好等于您感兴趣的字段

你在这里做了一些奇怪的事情,我想你可以简化很多

首先,
setCurrency(currency)
将根据范围进行评估。由于您从未在范围上定义字段
货币
,因此这将始终是未定义的

您正在使用许多额外的变量来引用可以直接引用的属性。清理这些会让你的生活简单得多

<> P>而不是你的方法,考虑一下:

<select
  ng-model="selectedCurrency"
  ng-options="currency as currency.cur_symbol + ' '
              + currency.cur_name_he for currency in currencies">
例如,
{selectedCurrency.cur_iso}
就是iso代码

最后,在选择开始时删除空白行,初始化值。e、 g:

$scope.currencies = [{
    "cur_iso": "ILS",
        "cur_symbol": "\u20aa",
        "cur_name_he": "\u05e9\u05e7\u05dc",
        "cur_rate_in_nis": 1.0000,
        "cur_last_update": "",
        "cur_order": "1",
        "cur_available": "1"
}, {
    "cur_iso": "USD",
        "cur_symbol": "$",
        "cur_name_he": "\u05d3\u05d5\u05dc\u05e8",
        "cur_rate_in_nis": 3.8580,
        "cur_last_update": "2015-02-24 13:34:25",
        "cur_order": "2",
        "cur_available": "1"
}];
// Initialise value so select is initially selected on something.
$scope.selectedCurrency = $scope.currencies[0]

希望您能看到这比原来的方法更简洁、更容易遵循。

10x,但是,bindCurrencyModel应该获取货币代码(选项值),而不是货币对象。@Wazime这没有意义。要访问该对象的
cur\u rate\u in\u nis
属性,需要使用
currences
数组中的完整对象。如果您只向函数传递货币代码,那么您需要首先在
货币
数组中查找完整对象,然后您可以访问该对象上所需的其他属性(
cur\u rate\u in\u nis
)。好的,但是bindCurrencyModel会获取所选货币对象,而我希望它只获取值(cur\u iso)通过在控制器中使用bindCurrencyModel.cur_iso,可以访问cur_iso属性。你需要整个对象,就像你的setCurrency函数编码一样。谢谢,我知道,我想我可能会找到一种方法,将select模型从货币数组中分离出来…你可以这样做,但是你必须更新你的setCurrency函数,这样它就不会期望整个对象进入Hanks,但是我需要
bindCurrencyModel
只包含货币cur_iso,该代码是指令的一部分,该指令将其暴露给希望bindCurrencyModel为货币iso字符串的控制器。@Wazime我更改了答案以适应您的需要。这里有一些优点,您的方法更简洁。不过,您需要解决有关设置
$scope.bindCurrencyModel
$scope.bindRateModel
的要求(该要求后来添加到问题中)。谢谢,但此代码是向控制器公开
bindCurrencyModel
bindRateModel
的指令的一部分。控制器希望将bindCurrencyModel作为curency的字符串,将bindRateModel作为货币的汇率。但是,我仍然认为应该将希望那些模型绑定到指令的值传递给指令,而不是让指令依赖于特定的控制器结构。只是让它更容易重复。
<input type="number" 
       ng-model="selectedCurrency.cur_rate_in_nis">
$scope.currencies = [{
    "cur_iso": "ILS",
        "cur_symbol": "\u20aa",
        "cur_name_he": "\u05e9\u05e7\u05dc",
        "cur_rate_in_nis": 1.0000,
        "cur_last_update": "",
        "cur_order": "1",
        "cur_available": "1"
}, {
    "cur_iso": "USD",
        "cur_symbol": "$",
        "cur_name_he": "\u05d3\u05d5\u05dc\u05e8",
        "cur_rate_in_nis": 3.8580,
        "cur_last_update": "2015-02-24 13:34:25",
        "cur_order": "2",
        "cur_available": "1"
}];
// Initialise value so select is initially selected on something.
$scope.selectedCurrency = $scope.currencies[0]