angularjs,发布$ scope和选择框

时间:2013-04-24 03:55:46

标签: angularjs

我正在通过创建表单来搞乱angularjs(这是非常好的顺便说一句)。我从json加载数据,我可以成功读取数据,但我对我制作的plunker有几个问题。 (http://plnkr.co/edit/LHX40xHKmoB9onboeNrV?p=preview

我有2个表格,两个都工作。在我继续之前,有一个对an​​gularjs 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。这可能对其他人有所帮助。

http://plnkr.co/edit/NDSvKS0mEF1Wgp2CBIOB?p=preview

1 个答案:

答案 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。

希望这有帮助。