我正在通过创建表单来搞乱angularjs(这是非常好的顺便说一句)。我从json加载数据,我可以成功读取数据,但我对我制作的plunker有几个问题。 (http://plnkr.co/edit/LHX40xHKmoB9onboeNrV?p=preview)
我有2个表格,两个都工作。在我继续之前,有一个对angularjs pro的请求:整体上我的plunker代码风格是正确的angularjs方式吗?我怎样才能改进它?感谢。
无论如何,以下片段是两种形式之间的区别:
的 FORM#1: 的
为了使表单起作用,我指定了“country
”,它从json中的countries
获取它的值。
JS :
$scope.vm.country = data[0].countries[0];
HTML:
Country: <select ng-model="vm.country" ng-options="c.name for c in vm.countries"></select>
的 FORM 2: 的
这个JSON与#2略有不同。 countries
数组称为country
。 select选项expr引用自身 - 失败。这里提交的json on-click
具有国家代码/名称的正确值,这是我所追求的,但它也包含cities
数组,这不是我想要的。
JS :
$scope.vm.country = data[0].country[0];
HTML:
Country: <select ng-model="vm.country" ng-options="c.name for c in vm.country"></select>
我想确切地知道为什么选择框的行为方式与form2相同。
至于提交表格,显然不希望发送无用的数据。那么您如何才能在$scope.vm
中仅发送您需要的内容?对于小表单,手动将每个输入添加到新的$ scope项目可以正常工作,但对于具有许多输入的大型表单,它将不是理想的。
更新
这是一个有效值的工作解决方案,它们被放入一个单独的变量($scope.form
)中。此外,$watch
已更改为ng-change
。这可能对其他人有所帮助。
答案 0 :(得分:3)
这是一个微妙的错误。如果您查看您的json文件,您会注意到您的“国家/地区列表”被命名为country。 将其更改为国家/地区。它失败的原因是因为在控制器中设置vm.country时覆盖整个列表。我已经分叉/更新您的 plunker 以显示简单的解决方法。
就表单数据而言,您可能希望将选择包装在表单元素中并以此方式获取值。查看有关此事的Angularjs's Page。
总的来说,我的plunker代码风格是正确的angularjs方式吗?我怎样才能改进它?感谢。
这一点都不错,因为它只有少数控制器。我在使用angular时发现了一些帮助你的东西:
1)对于像这样的情况,调试html会很烦人。幸运的是,angular的“angular.element”方法返回html AS WELL AS检查元素范围的能力。观看debugging tutorial如何运作。无论您使用的是firebug还是chrome dev工具,都应该适用相同的概念。
2)想一想你可以尽可能避免使用$ watch方法的方法。原因是每次在应用程序中发生任何更新时都会调用此方法,即使更新与调用的范围没有直接关系也是如此。作为建议,您可能希望在select语句中添加ng-change指令,该指令只应在实际dom元素更改时触发,而不是让$ watch在框架中触发每个$ digest。
希望这有帮助。