在 Angular 中,无法绑定到页面加载指令中的单选按钮
In Angular, unable to bind to a radio button in a directive on page load
当前情况:我有通过指令动态创建的表单域。其中一种类型包括单选按钮。
目标:在页面加载时,我需要将这些元素的值绑定到预定义的范围。这适用于其他字段类型但不适用于单选按钮,尽管 $parent.model 与选项 exactly.As 匹配,您可以在 JSFiddle 中看到,"your_name_0" 和 "description_1" 绑定正确但不是单选按钮。
约束:由于代码限制,指令的 ng-model 和 ng-value 不能更改。 我知道可以将单选按钮的模型绑定到对象。见此证明:http://plnkr.co/edit/OnHXect37Phij9VAB0ET?p=preview
控制者:
function MyCtrl($scope) {
//defines the field types
$scope.formFields = [
{
"fieldName": "Your Name",
"uniqueId": "your_name_0",
"fieldType": "text"
},
{
"fieldName": "Description",
"uniqueId": "description_1",
"fieldType": "textarea"
},
{
"fieldName": "Favorite Color",
"uniqueId": "favorite_color_2",
"fieldType": "radio"
"fieldTypeOptionsArray":[
{
"formFieldId":"favorite_color_2",
"optionId":"favorite_color_2_0",
"optionValue":"yellow"
},
{
"formFieldId":"favorite_color_2",
"optionId":"favorite_color_2_1",
"optionValue":"blue"
}
]
}
];
//values to bind to the model
$scope.output={
"your_name_0":"Bob",
"description_1":"I am a developer",
"favorite_color_2":
{
"optionValue":"yellow",
"formFieldId":"favorite_color_2",
"optionId":"favorite_color_2_0"
}
};
};
指令:
myApp.directive("formField",function($compile){
var templates = {
textTemplate:'<div class="form-group"><label for="{{content.uniqueId}}" >{{content.fieldName}}</label><input type="text" ng-model="model" name="{{content.uniqueId}}" class="form-control" id="{{content.uniqueId}}"/> </div><br>',
textareaTemplate:'<div class="form-group"><label for="{{content.uniqueId}}" >{{content.fieldName}}</label> <textarea ng-model="model" name="{{content.uniqueId}}" id="{{content.uniqueId}}" class="form-control"></textarea> </div>',
radioTemplate : '<div class="form-group"><label>{{content.fieldName}}</label><div class=""><div class="radio" ng-repeat="option in content.fieldTypeOptionsArray"><label><input type="radio" name="{{content.uniqueId}}" ng-value="option" id="{{option.optionId}}" ng-model="$parent.model">{{option.optionValue}}</label></div></div></div>',
};
var getTemplate = function(content, attrs){
var template = {};
template = templates[content.fieldType+"Template"];
if(typeof template != 'undefined' && template != null) {
return template;
}
else {
return '';
}
};
var linker = function(scope, element, attrs){
element.html(getTemplate(scope.content, attrs)).show();
$compile(element.contents())(scope);
}
return {
restrict:"E",
replace:true,
link:linker,
scope:{
content:'=',
model:'=?'
}
};
});
这是一个 JSFiddle:
http://jsfiddle.net/scheedalla/d2jzmmd7/
卡了一段时间,一直搞不懂问题的根源。它与它是嵌套对象有关,或者因为它在指令中。任何帮助都会有用,如果您需要进一步说明,请告诉我!谢谢!!
当我将 ng-value 和 ng-model 更改为选项的值而不是整个选项对象时似乎有效。
之前和之后:
<input type="radio" name="{{content.uniqueId}}" ng-value="option" id="{{option.optionId}}" ng-model="$parent.model" >
<input type="radio" name="{{content.uniqueId}}" ng-value="option.optionValue" id="{{option.optionId}}" ng-model="model.optionValue"
我找到了解决方案。我将其添加到我的控制器中。如果我将 $scope.output[favorite_color_2] 映射到 $scope.formFields 中的等效值,它就起作用了。这背后的原因是 ng-repeat 中的项目只能映射到其父范围内的内容。在这种情况下,$scope.formFields。
angular.forEach($scope.output, function(value,key){
for(var f=0;f<$scope.formFields.length;f++){
if(key == $scope.formFields[f].uniqueId){
if($scope.formFields[f].fieldType == 'radio'){
console.log($scope.formFields[f].fieldTypeOptionsArray.length);
for (var z=0;z<$scope.formFields[f].fieldTypeOptionsArray.length;z++){
if($scope.formFields[f].fieldTypeOptionsArray[z].optionValue == value.optionValue){
$scope.output[key]=$scope.formFields[f].fieldTypeOptionsArray[z];
}
}
}
}
}
});
已更新 JSFiddle:http://jsfiddle.net/scheedalla/d2jzmmd7/17/
当前情况:我有通过指令动态创建的表单域。其中一种类型包括单选按钮。
目标:在页面加载时,我需要将这些元素的值绑定到预定义的范围。这适用于其他字段类型但不适用于单选按钮,尽管 $parent.model 与选项 exactly.As 匹配,您可以在 JSFiddle 中看到,"your_name_0" 和 "description_1" 绑定正确但不是单选按钮。
约束:由于代码限制,指令的 ng-model 和 ng-value 不能更改。 我知道可以将单选按钮的模型绑定到对象。见此证明:http://plnkr.co/edit/OnHXect37Phij9VAB0ET?p=preview
控制者:
function MyCtrl($scope) {
//defines the field types
$scope.formFields = [
{
"fieldName": "Your Name",
"uniqueId": "your_name_0",
"fieldType": "text"
},
{
"fieldName": "Description",
"uniqueId": "description_1",
"fieldType": "textarea"
},
{
"fieldName": "Favorite Color",
"uniqueId": "favorite_color_2",
"fieldType": "radio"
"fieldTypeOptionsArray":[
{
"formFieldId":"favorite_color_2",
"optionId":"favorite_color_2_0",
"optionValue":"yellow"
},
{
"formFieldId":"favorite_color_2",
"optionId":"favorite_color_2_1",
"optionValue":"blue"
}
]
}
];
//values to bind to the model
$scope.output={
"your_name_0":"Bob",
"description_1":"I am a developer",
"favorite_color_2":
{
"optionValue":"yellow",
"formFieldId":"favorite_color_2",
"optionId":"favorite_color_2_0"
}
};
};
指令:
myApp.directive("formField",function($compile){
var templates = {
textTemplate:'<div class="form-group"><label for="{{content.uniqueId}}" >{{content.fieldName}}</label><input type="text" ng-model="model" name="{{content.uniqueId}}" class="form-control" id="{{content.uniqueId}}"/> </div><br>',
textareaTemplate:'<div class="form-group"><label for="{{content.uniqueId}}" >{{content.fieldName}}</label> <textarea ng-model="model" name="{{content.uniqueId}}" id="{{content.uniqueId}}" class="form-control"></textarea> </div>',
radioTemplate : '<div class="form-group"><label>{{content.fieldName}}</label><div class=""><div class="radio" ng-repeat="option in content.fieldTypeOptionsArray"><label><input type="radio" name="{{content.uniqueId}}" ng-value="option" id="{{option.optionId}}" ng-model="$parent.model">{{option.optionValue}}</label></div></div></div>',
};
var getTemplate = function(content, attrs){
var template = {};
template = templates[content.fieldType+"Template"];
if(typeof template != 'undefined' && template != null) {
return template;
}
else {
return '';
}
};
var linker = function(scope, element, attrs){
element.html(getTemplate(scope.content, attrs)).show();
$compile(element.contents())(scope);
}
return {
restrict:"E",
replace:true,
link:linker,
scope:{
content:'=',
model:'=?'
}
};
});
这是一个 JSFiddle: http://jsfiddle.net/scheedalla/d2jzmmd7/
卡了一段时间,一直搞不懂问题的根源。它与它是嵌套对象有关,或者因为它在指令中。任何帮助都会有用,如果您需要进一步说明,请告诉我!谢谢!!
当我将 ng-value 和 ng-model 更改为选项的值而不是整个选项对象时似乎有效。
之前和之后:
<input type="radio" name="{{content.uniqueId}}" ng-value="option" id="{{option.optionId}}" ng-model="$parent.model" >
<input type="radio" name="{{content.uniqueId}}" ng-value="option.optionValue" id="{{option.optionId}}" ng-model="model.optionValue"
我找到了解决方案。我将其添加到我的控制器中。如果我将 $scope.output[favorite_color_2] 映射到 $scope.formFields 中的等效值,它就起作用了。这背后的原因是 ng-repeat 中的项目只能映射到其父范围内的内容。在这种情况下,$scope.formFields。
angular.forEach($scope.output, function(value,key){
for(var f=0;f<$scope.formFields.length;f++){
if(key == $scope.formFields[f].uniqueId){
if($scope.formFields[f].fieldType == 'radio'){
console.log($scope.formFields[f].fieldTypeOptionsArray.length);
for (var z=0;z<$scope.formFields[f].fieldTypeOptionsArray.length;z++){
if($scope.formFields[f].fieldTypeOptionsArray[z].optionValue == value.optionValue){
$scope.output[key]=$scope.formFields[f].fieldTypeOptionsArray[z];
}
}
}
}
}
});
已更新 JSFiddle:http://jsfiddle.net/scheedalla/d2jzmmd7/17/