AngularJS ng模型不进行双向数据绑定
我有一个带有如下输入框的标签:AngularJS ng模型不进行双向数据绑定,angularjs,data-binding,angularjs-scope,Angularjs,Data Binding,Angularjs Scope,我有一个带有如下输入框的标签: <label class="item item-input"> <input type="text" data-ng-model="description" placeholder="Add a Description!"> </label> 在我的HTML中,我还有一行: <div ng-show="description.length <= maxChars">{{descr
<label class="item item-input">
<input type="text" data-ng-model="description"
placeholder="Add a Description!">
</label>
在我的HTML中,我还有一行:
<div ng-show="description.length <= maxChars">{{description}}</div>
{{description}
当用户在输入框内键入后点击submit按钮时,将调用submit函数。说明显示正确。当用户在输入框中键入时,说明会在HTML中更新,但不会在控制器中更新
我有一种感觉,它与将description设置为空字符串有关,但就HTML而言,它显然正在得到更新。但它保留console.logging和空字符串
为了实现这一点,我必须将描述直接传递到submit函数中(并相应地更新函数):
提交
这是完全没有必要的,因为Angular应该自动执行双向数据绑定,但事实并非如此
有人有什么想法吗
任何帮助都将不胜感激
编辑:
这里是由于流行的需求完整的HTML
<ion-view title="Moments" id="page2">
<ion-content padding="true" class="has-header">
<img src="{{picture}}" height="300px" width="100%"> </img>
<div class="row">
<div ng-show="description.length > maxChars" style= "color: red">{{description}}</div>
<div ng-show="description.length <= maxChars">{{description}}</div>
</div>
<div class="row" ng-if="description">
<div ng-show="description.length > maxChars" style= "color: red">{{description.length}} / {{maxChars}}</div>
<div ng-show="description.length <= maxChars" style= "color: green">{{description.length}} / {{maxChars}}</div>
</div>
<div class="row">
<div class="col">
<label class="item item-input">
<input type="text" data-ng-model="description" placeholder="Add a Description!">
</label>
</div>
<button style="margin-right: 5px" class="col col-10 button button-positive" data-ng-click="checkDescription(description)">OK</button>
</div>
<div class="row">
<div class="col"><ion-checkbox data-ng-change="changeLocation()" data-ng-model="location">Show Location</ion-checkbox></div>
</div>
<div class="row">
<div class="button-bar">
<button class="button button-assertive" data-ng-click="cancel()">Cancel</button>
<button class="button button-positive" data-ng-click="submit(description)">Submit</button>
</div>
</div>
</ion-content>
</ion-view>
{{description}}
{{description}}
{{description.length}/{{maxChars}
{{description.length}/{{maxChars}
好啊
显示位置
取消
提交
我还知道,在这个问题中,submit函数不带任何参数。这就是我想要的。目前我的提交按钮接受一个参数(说明)。这不应该是必要的。我对函数“checkDescription”也有同样的问题。该函数也应该没有参数,但我不得不将描述直接传递到函数中。我不想做的事
执行摘要:
在AngularJS中,子作用域通常从其父作用域原型继承。此规则的一个例外是使用作用域:{…}
的指令——这会创建一个不典型继承的“隔离”作用域。(和带有转换的指令)此构造通常在创建“可重用组件”指令时使用。在指令中,默认情况下直接使用父范围,这意味着指令中来自父范围的任何更改都将在父范围中更改。如果设置了scope:true
(而不是scope:{…}
),则该指令将使用原型继承
作用域继承通常是直接的,您甚至不需要知道它正在发生。。。直到您尝试将双向数据绑定(即表单元素、ng模型)从子作用域内部绑定到父作用域上定义的基元(例如数字、字符串、布尔值)。它不像大多数人期望的那样工作。发生的情况是,子作用域获取自己的属性,该属性隐藏/隐藏同名的父属性。这不是AngularJS正在做的事情——这是JavaScript原型继承的工作方式。新的AngularJS开发人员通常没有意识到ng repeat
、ng switch
、ng view
、ng include
和ng if
都会创建新的子范围,因此当涉及到这些指令时,问题往往会出现。(有关问题的快速说明,请参阅。)
通过遵循“最佳实践”,可以很容易地避免原语的这个问题–观看3分钟。Misko演示了ng开关的基本绑定问题
我尝试在我的范围内使用“.”符号,但每当我尝试这样引用它时:
$scope.moment.description = "";
它表示“无法读取未定义的的属性“描述”
在将值指定给特性之前,代码需要创建对象:
$scope.moment = {};
$scope.moment.description = "";
//OR
$scope.moment = { description: "" };
它应该更新正确。也不需要监视。但是你能完整地发布你的代码吗?或者说,你在html中使用'submit(description'),但声明'submit=function()“…是否有一个ng if
或ng repeat
或其他指令在输入元素和控制器之间创建作用域?如果在ng模型中不使用点
,可能会导致问题。有关更多信息,请参阅。我尝试在我的作用域中使用“.”符号,但每当我尝试这样引用它时:$sco”pe.moment.description=“”;它表示“无法读取未定义的属性“描述”。
$scope.moment.description = "";
$scope.moment = {};
$scope.moment.description = "";
//OR
$scope.moment = { description: "" };