从Javascript设置ng-model名称

时间:2015-04-03 18:02:35

标签: javascript html angularjs

如何从javascript设置ng-model名称?

HTML

<div ng-repeat="model in models">
    <input ng-model="?">
</div

JS

$scope.models= [
   {name: "modelOne"},
   {name: "modelTwo"},
   {name: "modelThree"}
];

非常感谢您的回答。

3 个答案:

答案 0 :(得分:4)

就像

一样简单
<div ng-repeat="model in models">
  <input ng-model="model.name">
</div>

说明

ng-repeat遍历您的models数组,并在每次迭代时在您的范围中添加model项。在ng-repeat内的HTML中,您可以使用model,就好像已将其从控制器中放入$scope

随时阅读更多documentation about ng-repeat

如果那不是您想要的

如果$scope.models应该是属性名称列表,例如你想要实际编辑$scope.modelOne而不是字符串modelOne本身(在第二次阅读时我认为可能是你是什​​么意思),你不能直接这样做,但你可以在两者之间使用一个对象,即编辑$scope.foo.modelOne而不是$scope.modelOne

<div ng-repeat="model in models">
  <input ng-model="foo[model.name]">
</div>

在您的控制器中

$scope.foo = {
  'modelOne':   'some text',
  'modelTwo':   'some other text',
  'modelThree': 'hello world'
}

答案 1 :(得分:1)

根据您问题中的代码,您似乎希望每个<input>都拥有models数组中列出的模型之一。如果是这样,只需:

<div ng-repeat="model in models">
    <input ng-model="model.name">
</div>

答案 2 :(得分:1)

如果你的目标是通过在变量中提供相应的模型名称来设置ngModel,那么你仍然可以使用古老的bracket notation轻松实现它。

所以说你有变量$scope.modelName = 'modelOne'并且你想设置模型,这样你就可以在模板中使用{{modelOne}}或在控制器中使用$scope.modelOne。如果使用括号表示法,则非常容易。在这种情况下,它将是$scope[$scope.modelName] = 'something'

在您的情况下,ngRepeat有一个警告,因为每次迭代都会创建自己的子范围,因此为了在适当的范围内设置模型,您需要使用$parent对初始范围的引用。所以它将是:

<div ng-repeat="model in models">
    <input ng-model="this.$parent[model.name]">
</div>

所以关键在于this在ngWhatever总是指向范围对象(控制器中的$scope)。由于它是一个对象,您只需使用bracket notation来访问具有变量名称的属性。

演示: http://plnkr.co/edit/DGj3H5qiyHKOxbbdtK8p?p=preview