ゲッターとセッターを介して外部オブジェクトのブール値プロパティを制御するラジオボタンを用意しようとしています。AngularJS、ゲッターとセッターのラジオボタン
Person
の複数の例がありますが、1つのみがhappy
です。そのうちの1人はすでに幸せです。私はラジオボタンでどれが幸せであるかを制御したい。
したがって、ラジオ入力のテンプレートを作成しましたが、このプロパティにアクセスできないため、person.happy
にバインドすることはできません(Person
はサードパーティ製のライブラリ)。
何かを入力にバインドするために、ダムコントローラを作成してデフォルト値(Person
の値)を提供し、変更を実際の変数に伝えます(要するに、setterを呼び出します)。私は物事を正しいものにすることはできません。
var app = angular.module('app', []);
// Person constructor ; happy is a private member
function Person(name, isHappy) {
var happy = isHappy;
this.name = name;
this.getHappy = function() { return happy; }
this.setHappy = function(value) { happy = value; }
}
// Inject a person list in the scope
app.controller('PeopleCtrl', function($scope) {
$scope.people = [
new Person('Alice', true),
new Person('Bob', false),
new Person('Carol', false)
];
});
// Template to display one person + happiness controller
var humanTemplate = [
'<div><label>',
'<input type="radio" name="group" ng-model="me.happy" ng-change="me.toggle()" value="{{ !me.happy }}">',
'<span>{{ person.name }} is {{ me.happy ? "happy" : "sad" }}</span>',
'</label></div>'
].join('');
// Directive to display one person
app.directive('human', function() {
return {
restrict: 'E',
template: humanTemplate,
scope: {
person: '='
},
controllerAs: 'me',
controller: function($scope) {
var me = this;
me.happy = $scope.person.getHappy();
me.toggle = function() {
console.log(me.happy);
$scope.person.setHappy(me.happy);
};
}
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular.min.js"></script>
<div ng-app="app" ng-controller="PeopleCtrl">
<human ng-repeat="p in people" person="p"></human>
</div>
私は(何らかの形で論理的であったであろう)ngChange
がラジオやチェックボックスにchecked
状態に接続することだろうと思っているだろうが、それ以外は私に言った症状があります
ngChange
は、以前にチェックされた無線機の発煙はありません。ngChange
は、ハンは、かつて
私は初心者ですので、私は誤解されるかもしれないが、それはngChange
のように見えますが、私が欲しいものではありません(私は入力value
属性をいじったときに、それは二回発射しました)。
この問題を解決するにはどうすればよいでしょうか? 他のアイテムがアクティブになったときに、一部のアイテムの無効化を手動で管理するために、親コントローラを作成する必要がありますか?
に動作します、私は本当に彼らが共有する理由です、彼らは一つだけが '任意の時点でchecked'ことで、ラジオボタンのように動作しますそれらの 'name'属性です。私がよく理解していれば、ラジオやチェックボックスを使用するかどうかにかかわらず、 'PeopleCtrl'のような親コントローラに' toggle() 'メソッドを実装しなければ、この独自性を持てません。 – GnxR
@GnxR「ラジオボタンのように振る舞い、いつでも1人だけチェックして、名前属性を共有してもらいたいのです」彼らの名前はすべて同じngモデルでなければなりません。だから、コントローラで作成し、ディレクティブに渡すことができます –