我从服务器端生成了一个select下拉列表,因此无法将其更改为使用javascript或array或ng-select。我想将选择的属性转换为javascript对象。
<select ng-model="selectedVal" ng-change="selectVal()">
<option value="val1" attr1="attr11val" attr2="attr12val" cp-option="allObjs">opt1</option>
<option value="val2" attr1="attr21val" attr2="attr22val" cp-option="allObjs" selected>opt2</option>
<option value="val3" attr1="attr31val" attr2="attr32val" cp-option="allObjs">opt3</option>
</select>
我希望“ selectedVal”看起来像这样:
{"value":"val2","attr1":"attr21val","attr2":"attr22val"}
我能想到的最好的解决方案是在每个选项中添加一条指令,以获取属性并将其推入对象数组。然后,我可以在选择下拉菜单上使用ng-change。然后根据选择的值在数组上获取选择的对象。
有一个更好的方法吗?
这里的指令看起来像:
app.directive('cpOption', function () {
function link(scope, elem, attr) {
var obj = {};
for (var property in attr.$attr) {
if (attr.hasOwnProperty(property))
obj[property] = attr[property];
}
scope.cpOption.push(obj);
}
return {
restrict: 'A',
link: link,
scope: {
cpOption: '=cpOption'
}
}
});
和控制器
app.controller('myCtrl', function ($scope) {
$scope.allObjs = [];
$scope.selectedVal = {};
$scope.selecteObj = {};
$scope.selectVal = function () {
for (var val in $scope.allObjs) {
if ($scope.allObjs[val].value === $scope.selectedVal) {
$scope.selecteObj = $scope.allObjs[val];
break;
}
}
}
});
还有更好的方法可以做到这一点吗?理想情况下,我不需要包含所有对象的数组,而只需要选定的对象。
jsfiddle:http : //jsfiddle.net/ocLrt7vp/7/
这对我有用。我创建了一个获取更改值的指令。然后将属性转换为对象。
app.directive('cpSelectAttrs', function () {
function link(scope, elem) {
elem.bind('change', function () {
getSelectionAttrs(scope, elem);
scope.$apply();
});
getSelectionAttrs(scope, elem);
}
function getSelectionAttrs(scope, elem){
var obj = {};
var attrs = (elem[0].selectedOptions[0].attributes);
var length = attrs.length;
obj.text = elem[0].selectedOptions[0].text;
for (var i = 0; i < length; i++) {
obj[attrs[i].localName] = attrs[i].value;
}
scope.cpSelectAttrs = obj;
}
return {
restrict: 'A',
link: link,
scope: {
cpSelectAttrs: '=cpSelectAttrs'
}
}
});
jsFiddle:http : //jsfiddle.net/yzLx6x7d/3/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句