angular 自定义单选按钮组件中的值未绑定
Value not binding in angular custom radio button component
我在 angular js 中创建了一个自定义单选按钮组件,它将在我的应用程序中使用。以下是我为组件编写的代码。
JS
angular.module("customComponent")
.component("ngRadiobutton", {
template:
'<label class="ng-control-radio-button">' +
' <span data-ng-bind="$ctrl.label"></span>' +
' <input type="radio" name="{{$ctrl.group}}" data-ng-model="$ctrl.checked"/>' +
' <div class="ng-control-indicator-radio"></div>' +
'</label>' +
'',
bindings: {
label: '=?',
checked: '=',
group: '@'
},
controller: function () {
var $ctrl = this;
console.log($ctrl.checked); // Data is binding properly at this stage
}
});
HTML
<div data-ng-repeat="radio in vm.radioValues">
<ng-radiobutton label="radio.label " group="group1 " checked="radio.checked"></ng-radiobutton>
</div>
JSON
vm.radioValues = [{ label: 'Value1', checked: true },
{ label: 'Value2', checked:false }
];
我面临的问题是 true 和 false 我设置的值未与组件绑定。默认情况下,这两个单选按钮都未选中。谁能告诉我我的代码有什么问题。
提前致谢
这是因为 javascript 中的布尔值是通过 按值 传递的,而不是 通过引用 传递的。要解决这个问题,只需传递一个对象而不是纯布尔值:
<ng-radiobutton label="radio.label " group="group1 " checked="radio"></ng-radiobutton>
和您的组件模板:
<input type="radio" name="{{$ctrl.group}}" data-ng-model="$ctrl.checked.checked"/>' +
您似乎在尝试让单选按钮具有复选框行为。 (这不是真正的绑定问题)
这是您可以拥有的有效版本:
angular.module("customComponent", [])
.component("ngRadiobutton", {
template:
'<label class="ng-control-radio-button">' +
' <span data-ng-bind="$ctrl.label"></span>' +
' <input type="radio" name="{{$ctrl.group}}" data-ng-model="$ctrl.checked" value="{{$ctrl.label}}" />' +
' <div class="ng-control-indicator-radio"></div>' +
'</label>' +
'',
bindings: {
label: '=?',
checked: '=',
group: '@'
},
controller: function () {
var $ctrl = this;
console.log($ctrl.checked); // Data is binding properly at this stage
}
});
angular.module("customComponent").controller('Ctrl', function($scope) {
$scope.group = {value: 'Value2' };
$scope.radioValues = [
{ label: 'Value1' },
{ label: 'Value2' }
];
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
<div ng-app="customComponent">
<div ng-controller="Ctrl">
<div data-ng-repeat="radio in radioValues">
<ng-radiobutton label="radio.label" group="group1" checked="group.value"></ng-radiobutton>
</div>
</div>
</div>
我在 angular js 中创建了一个自定义单选按钮组件,它将在我的应用程序中使用。以下是我为组件编写的代码。
JS
angular.module("customComponent")
.component("ngRadiobutton", {
template:
'<label class="ng-control-radio-button">' +
' <span data-ng-bind="$ctrl.label"></span>' +
' <input type="radio" name="{{$ctrl.group}}" data-ng-model="$ctrl.checked"/>' +
' <div class="ng-control-indicator-radio"></div>' +
'</label>' +
'',
bindings: {
label: '=?',
checked: '=',
group: '@'
},
controller: function () {
var $ctrl = this;
console.log($ctrl.checked); // Data is binding properly at this stage
}
});
HTML
<div data-ng-repeat="radio in vm.radioValues">
<ng-radiobutton label="radio.label " group="group1 " checked="radio.checked"></ng-radiobutton>
</div>
JSON
vm.radioValues = [{ label: 'Value1', checked: true },
{ label: 'Value2', checked:false }
];
我面临的问题是 true 和 false 我设置的值未与组件绑定。默认情况下,这两个单选按钮都未选中。谁能告诉我我的代码有什么问题。
提前致谢
这是因为 javascript 中的布尔值是通过 按值 传递的,而不是 通过引用 传递的。要解决这个问题,只需传递一个对象而不是纯布尔值:
<ng-radiobutton label="radio.label " group="group1 " checked="radio"></ng-radiobutton>
和您的组件模板:
<input type="radio" name="{{$ctrl.group}}" data-ng-model="$ctrl.checked.checked"/>' +
您似乎在尝试让单选按钮具有复选框行为。 (这不是真正的绑定问题)
这是您可以拥有的有效版本:
angular.module("customComponent", [])
.component("ngRadiobutton", {
template:
'<label class="ng-control-radio-button">' +
' <span data-ng-bind="$ctrl.label"></span>' +
' <input type="radio" name="{{$ctrl.group}}" data-ng-model="$ctrl.checked" value="{{$ctrl.label}}" />' +
' <div class="ng-control-indicator-radio"></div>' +
'</label>' +
'',
bindings: {
label: '=?',
checked: '=',
group: '@'
},
controller: function () {
var $ctrl = this;
console.log($ctrl.checked); // Data is binding properly at this stage
}
});
angular.module("customComponent").controller('Ctrl', function($scope) {
$scope.group = {value: 'Value2' };
$scope.radioValues = [
{ label: 'Value1' },
{ label: 'Value2' }
];
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
<div ng-app="customComponent">
<div ng-controller="Ctrl">
<div data-ng-repeat="radio in radioValues">
<ng-radiobutton label="radio.label" group="group1" checked="group.value"></ng-radiobutton>
</div>
</div>
</div>