我有以下代码:
as.controller('OvrigtCtrl', function($scope, $rootScope, $http, $routeParams, $location)
{
$scope.opt = {};
$scope.addSupercustomerOvrigt = function()
{
$scope.doAddSupercustomer = true;
}
$scope.addS = function()
{
console.log($scope.opt.selectedTabell); //Shows the value
console.log($scope.selectedTabell); //Shows undefined
}
});
HTML:
<div ng-if="doAddSupercustomer">
<table class="table">
<tr>
<td>Namn</td><td><input class="form-control input-sm2" type="text" ng-model="selectedNamn"></td>
</tr>
<tr>
<td>Abonnemangstabell</td><td><input class="form-control input-sm2" type="text" ng-model="opt.selectedTabell"></td>
</tr>
<tr>
<td>Har regportal</td><td><input type="checkbox" ng-model="selectedRegportal"></td>
</tr>
<tr>
<td>Fri DHCP</td><td><input type="checkbox" ng-model="selectedDhcp"></td>
</tr>
</table>
<button type="submit" ng-click="addS()" class="btn btn-success input-sm2">Lägg till</button>
</div>
为什么我不使用对象将范围变量添加到?
时会收到未定义的消息ng-model="selectedTabell"
console.log($scope.selectedTabell)
上面的代码结果是一条未经解释的消息。
ng-model="opt.selectedTabell"
$scope.opt = {};
console.log($scope.opt.selectedTabell)
上面的代码有效。我可以看到用户输入的值。
所以我的问题是,为什么我必须使用一个对象?在这种情况下?
答案 0 :(得分:0)
您正面临子范围继承问题。 ng-if
将在您的控制器中创建一个子范围,这意味着,范围绑定到输入框是范围绑定到控制器的子节点。如果您是与原始值selectedTabell
绑定的数据,则在您第一次更新输入框时,实际上是在创建一个新的&quot; selectedTable1&#39;儿童范围内的财产。
解决方案是避免绑定到原始值。而是确保通过绑定到对象来使用点符号。
有关详细信息,请参阅Angular文档:Understand Scopes
范围继承通常是直截了当的,你通常不会 甚至需要知道它正在发生......直到你尝试双向数据绑定 (即表格元素,ng-模型)到基元(例如,数字,字符串, boolean)在子范围内从父范围定义。它 没有像大多数人期望的那样工作。怎么了 是孩子范围得到自己的隐藏/阴影的属性 同名的父属性。这不是AngularJS的内容 做 - 这就是JavaScript原型继承的工作原理。新 AngularJS开发人员通常没有意识到ng-repeat,ng-switch, ng-view和ng-include都创建了新的子范围,所以问题就出现了 经常出现涉及这些指令的时候。 (见这个例子 为了快速说明问题。)
通过遵循以下内容,可以轻松避免使用原语这个问题 &#34;最佳实践&#34;总是有一个&#39;。在您的ng模型中