这是我有角度的JS的第一天,所以我是一个新手,我要求对我不理解的行为做一些解释。我正在尝试构建一个由" panel"组成的表单。每个面板包含许多表单元素(复选框,单选按钮组等)或消息。一开始只有第一个面板可见。每次用户做出"动作" (检查一下,选择一些东西)。根据之前的选择和其他数据显示一个面板(有时更多)。
每个表单元素的模型都在控制器中。每个面板都有一个指令ngShow和一个控制器中的函数,它返回是否应该显示该面板。以下是我的代码中两个面板的一个小摘录:
第一个面板(ROOT面板始终显示)
<div class="panel panel-default" data-ng-show="true">
<div class="panel-heading">
<h3 class="panel-title">PLP</h3>
</div>
<div class="panel-body">
<div class="form-group">
<div class="col-xs-offset-0 col-xs-10">
<div class="radio">
<label><input type="radio" name="group" data-ng-model="choixPlp" value="plp1"> PLP 1</label>
</div>
<div class="radio">
<label><input type="radio" name="group" data-ng-model="choixPlp" value="plp2"> PLP 2</label>
</div>
<div class="radio">
<label><input type="radio" name="group" data-ng-model="choixPlp" value="plp3"> PLP3</label>
</div>
</div>
</div>
<p> {{choixPlp}} </p>
</div>
</div>
第二小组
<div class="panel panel-default"
data-ng-show="fmotifRetourCommentaires()">
<div class="panel-heading">
<h3 class="panel-title">Dépot</h3>
</div>
<div class="panel-body">
<div class="form-group">
<div class="col-xs-offset-0 col-xs-10">
<label> Motif Retour : {{motif}} </label>
<p>Commentaires</p>
<div class="textarea"></div>
<textarea rows="" cols=""></textarea>
<br />
<button type="submit" class="btn btn-default">Déposer</button>
</div>
</div>
</div>
</div>
App.js
var app = angular.module('dynamicForm', []);
app.controller('MainCtrl', function($scope) {
$scope.choixPlp;
$scope.motif;
$scope.fmotifRetourCommentaires = function() {
if ($scope.choixPlp == "plp1") {
$scope.motif = "Degroupage Abusif";
return true;
}
if ($scope.choixPlp == "plp2") {
$scope.motif = "Deconstruction a tort";
return true;
}
return false;
};
});
我的问题是视图没有显示变量&#34; motif&#34;的值。当我在第一个面板上更改我的选择时,在第二个面板中不会改变。只有在新选项上单击两次才会更改。我确实添加了这部分代码并且它有效,但我不明白为什么......
setInterval(function() {
$scope.$apply()
}, 500)
答案 0 :(得分:0)
第一次点击不工作但第二次点击的原因是因为模型没有设置,直到你的单选按钮失去焦点(我认为手表和刷新的顺序由于某种原因不合适)< / p>
由于您希望根据choixPlp的值执行某些操作,因此可以考虑在该变量上设置监视。我稍微修改了你的代码并使用了变量show_panel_2,并根据watch中的函数设置或取消设置该标志。
<div class="panel panel-default"
data-ng-show="show_panel_2">
<div class="panel-heading">
<h3 class="panel-title">Dépot</h3>
</div>
<div class="panel-body">
<div class="form-group">
<div class="col-xs-offset-0 col-xs-10">
<label> Motif Retour : {{motif}} </label>
<p>Commentaires</p>
<div class="textarea"></div>
<textarea rows="" cols=""></textarea>
<br />
<button type="submit" class="btn btn-default">Déposer</button>
</div>
</div>
</div>
</div>
<script>
var app = angular.module('dynamicForm', []);
app.controller('MainCtrl', function($scope) {
$scope.choixPlp;
$scope.motif;
$scope.show_panel_2 = false;
$scope.$watch('choixPlp', function() {
if ($scope.choixPlp == "plp1") {
$scope.motif = "Degroupage Abusif";
$scope.show_panel_2 = true;
return;
}
if ($scope.choixPlp == "plp2") {
$scope.motif = "Deconstruction a tort";
$scope.show_panel_2 = true;
return;
}
$scope.show_panel_2 = false;
});
});
</script>