将复选框和下拉框的值传递到同一个数组中
Pass value of checkbox and dropdown into same array
我目前正在创建一个表单,允许用户根据他们选择的功能向他们的集合添加新功能。此表单的结构是由复选框和下拉框组成的表格。复选框允许用户选择他们希望添加的功能,下拉框允许他们选择使用该功能的专业水平。
下面是表单的HTML:
<form class="listOfCaps">
<table>
<tbody>
<tr ng-repeat-start="cap in capsarr"></tr>
<tr ng-repeat-start="capname in filteredCaps track by capname.cid"></tr>
<td>
<input type="checkbox" name="selectedCaps[]" value="{{capname}}" ng-model="capname.selected" /> <span>{{capname.capname}}</span>
</td>
<td>
<span class="custom-dropdown custom-dropdown--white">
<select
class="custom-dropdown__select custom-dropdown__select--white"
name = "selectedExp[]"
ng-options = "exp.id as exp.level for exp in expertise"
ng-model = "exp">
<option value="">Select One</option>
</select>
</span>
</td>
<tr ng-repeat-end="capname in cap.capabilities"></tr>
<tr ng-repeat-end="cap in capsarr"></tr>
</tbody>
</table>
</form>
我想做的是让复选框的值和下拉填充一个数组或者更新数组中的值如果改变了。我试过这样做,只能够获得复选框值填充在数组中。我使用了$watch,所以当它被选中时,它被添加,当它被选中时,它被删除。我不知道如何将此应用于相同$watch中的下拉值,以便将这些值添加到数组中的相同对象中。
这是我的控制器代码:
$scope.expertise = [
{id: '1', level: 'Certified'},
{id: '2', level: 'Knowledgable'},
{id: '3', level: 'Interested'}
];
$scope.selection = [];
$scope.$watch('filteredCaps | filter:{selected:true}', function (newValues) {
$scope.selection = newValues.map(function (capname) {
return {"capname" : capname.capname, "cid": capname.cid};
});
}, true);
注意:filteredCaps是一个存储在$scope中的数组。filteredCaps来自上一个函数。此数组包含由功能名称和id
组成的对象。
如果它不需要是一个数组,你可以选择一个对象:
$scope.selection = {};
然后在你的视图上:
<input type="checkbox" ... ng-model="selection[capname]" ... />
<select ... ng-model = "selection[capname + '_Exp']" ...>
如果复选框被选中,那么您的selection
对象应该有一个属性capname
,其值为capname
,以及一个属性capname_Exp
,其值来自下拉框。
当你想把它保存回数据库时,你可以很容易地迭代对象的属性:
for (var prop in obj) {
// do your logic here
}
在对代码进行了一些混乱之后,我能够找到一个适合我现在需要的解决方案。与@JoaoLeal建议的类似,我更新了下拉菜单上的ng-model,使其与复选框上的模型相同,但引用了不同的属性。然后在我的控制器中,我简单地将下拉值添加到返回对象中,以便将其推送到具有所选功能的数组中。我还改变了我的专长数组,以更好地与我的代码。
通过这样做,每当一个复选框被选中时,它就被添加到数组中,然后一旦一个下拉值被选中,它就被添加到数组中的复选框值下面。选中复选框后,整个对象(复选框值和下拉框值)将从数组中删除。如果下拉列表的值改变了,那么它会立即在数组中更新。
下面是更新后的代码:
HTML:<form class="listOfCaps">
<table>
<tbody>
<tr ng-repeat-start="cap in capsarr"></tr>
<tr ng-repeat-start="capname in filteredCaps track by capname.cid"></tr>
<td>
<input type="checkbox" name="selectedCaps[]" value="{{capname}}" ng-model="capname.selected" /> <span>{{capname.capname}}</span>
</td>
<td>
<span class="custom-dropdown custom-dropdown--white">
<select
class="custom-dropdown__select custom-dropdown__select--white"
name = "selectedExp[]"
ng-options = "exp for exp in expertise"
ng-model = "capname.selectedExp">
<option value="">Select One</option>
</select>
</span>
</td>
<tr ng-repeat-end="capname in cap.capabilities"></tr>
<tr ng-repeat-end="cap in capsarr"></tr>
</tbody>
</table>
</form>
控制器:
$scope.expertise = [
'Certified',
'Knowledgable',
'Interested'
];
$scope.selection = [];
$scope.$watch('filteredCaps | filter:{selected:true}', function (newValues) {
$scope.selection = newValues.map(function (capname) {
return {"capname" : capname.capname, "cid": capname.cid, "exp":capname.selectedExp};
});
}, true);
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 无法通过数组映射绑定
- 你如何使 Math.random 数组中的每一个第 9 个元素都是同一个元素?[JavaScript]
- 为什么这个 JavaScript 代码使整个数组指向同一个对象
- JavaScript 数组到同一个 php 文件上的 php 脚本
- JavaScript 如何将函数结果与数组中的值一起传递到同一个函数中
- angular-Js:不能在同一个控制器的不同函数调用中访问数组元素
- 从数组中获取随机元素,显示它,然后循环-但永远不要跟在同一个元素后面
- Ajax在同一个请求中发送数组和图像
- 从同一个MySQL查询填充两个javascript数组