【发布时间】:2014-05-21 17:37:17
【问题描述】:
我创建了一个带有单选按钮的 AngularJS 指令来控制我的页面将查询哪个环境并将其添加到我的页面中。我正在使用双向绑定将名为environment 的局部范围变量映射到同名的应用程序变量。当我在模板中显式创建单选按钮时,它似乎运行良好(在我的实际代码中,我使用templateUrl,但仍然有同样的问题)。
<div>
<label><input type="radio" name="env" ng-model="environment" ng-change="changeEnvironment(1)" value="1" />Testing</label>
<label><input type="radio" name="env" ng-model="environment" ng-change="changeEnvironment(2)" value="2" />Production</label>
</div>
我可以根据需要多次选择每个选项,并且值会一直冒泡到应用程序的范围变量。
我想更改单选按钮的创建以在选择对象数组上使用ng-repeat。它创建选项,并捕获ngChange 事件,但每个选项只捕获一次。
<label ng-repeat="choice in choices">
<input type="radio" name="env" ng-model="environment" ng-change="changeEnvironment(choice)" value="{{ choice.id }}" />{{ choice.name }}
</label>
Here is the working version fiddle 和我的指令代码的相关部分:
template: '<div>'
+ '<label><input type="radio" name="env" ng-model="environment" ng-change="changeEnvironment(1)" value="1" />Testing</label>'
+ '<label><input type="radio" name="env" ng-model="environment" ng-change="changeEnvironment(2)" value="2" />Production</label>'
+ '<div>Directive environment: {{ environment }}</div>'
+ '</div>',
link: function(scope, element, attributes) {
scope.changeEnvironment = function(choiceID) {
console.log('SELECTED environment ' + choiceID);
scope.environment = choiceID;
console.log('directive environment = ' + scope.environment);
};
}
还有here is the version that only works once:
template: '<div><label ng-repeat="choice in choices">'
+ '<input type="radio" name="env" ng-model="environment" ng-change="changeEnvironment(choice)" value="{{ choice.id }}" />{{ choice.name }}'
+ '</label>'
+ '<div>Directive environment: {{ environment }}</div>'
+ '</div>',
link: function(scope, element, attributes) {
scope.choices = [
{ id: 1, name: "Testing" },
{ id: 2, name: "Production" }
];
scope.changeEnvironment = function(choice) {
console.log('SELECTED environment ' + choice.id);
scope.environment = choice.id;
console.log('directive environment = ' + scope.environment);
};
}
我是 AngularJS 的新手,所以我完全有可能犯了一个非常基本的错误。谁能指出我正确的方向?
更新 根据 callmekatootie 的建议,我将相关事件从 ng-change 更改为 ng-click,并且每次都会触发。现在可以解决此问题,但我最初使用ng-change,因为我认为ng-click 不会应用于由单击文本标签而不是输入本身引起的更改,但实际上确实如此。不过,仍然不明白为什么 ng-change 只触发一次。
【问题讨论】:
-
尝试使用
ng-click而不是ng-change- 虽然是另一种选择。我不知道为什么ng-change每次更改都不会触发。 -
@callmekatootie - 这似乎解决了它。我最初将它命名为
ng-change,因为我认为ng-click不会应用于标签,所以我想捕获事件然而它发生了。奇怪的是,点击文本似乎也会在输入本身上触发ngClick——我没想到会这样。这将帮助我继续前进,尽管我仍然不确定为什么它只适用于ng-change。 -
这是由于原型继承在 JavaScript 中的工作方式以及 ng-repeat 中的每个元素创建一个新范围的事实。如果您仍然需要它,我可以在答案中解释。
-
@tasseKATT - 如果您不介意,那就太好了。似乎它在第一次被点击时设置了它的状态,而当另一个被选中时它没有被更新。这似乎与以下事实有关:如果我从单选按钮中删除
name属性,它们就会停止协同工作。我不认为它们像我想象的那样与environment变量相关联。
标签: angularjs angularjs-directive