Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ng模型不更新控制器值_Javascript_Angularjs_Data Binding_Angular Ngmodel - Fatal编程技术网

Javascript Ng模型不更新控制器值

Javascript Ng模型不更新控制器值,javascript,angularjs,data-binding,angular-ngmodel,Javascript,Angularjs,Data Binding,Angular Ngmodel,可能是个愚蠢的问题,但我有一个简单的html表单和按钮: <input type="text" ng-model="searchText" /> <button ng-click="check()">Check!</button> {{ searchText }} 为什么单击按钮时在控制台中看到视图已正确更新但未定义 谢谢 更新: 看起来我已经解决了这个问题(之前我不得不想出一些解决办法),方法是: 只需将我的属性名从searchText更改为search.

可能是个愚蠢的问题,但我有一个简单的html表单和按钮:

<input type="text" ng-model="searchText" />
<button ng-click="check()">Check!</button>
{{ searchText }}
为什么单击按钮时在控制台中看到视图已正确更新但未定义

谢谢

更新: 看起来我已经解决了这个问题(之前我不得不想出一些解决办法),方法是:
只需将我的属性名从
searchText
更改为
search.text
,然后定义空的
$scope.search={}控制器中的对象,瞧。。。但我不知道它为什么会起作用;]

看看这把小提琴


我(我想!)已经完全完成了你正在做的事情,而且看起来很有效。您能检查一下什么不适合您吗?

控制器版本(推荐)

这里是模板

<div ng-app="example" ng-controller="myController as $ctrl">
    <input type="text" ng-model="$ctrl.searchText" />
    <button ng-click="$ctrl.check()">Check!</button>
    {{ $ctrl.searchText }}
</div>
例如:

最好使用角度为2.x或1.5或更高的组件

######## 旧方式(不推荐)

不建议这样做,因为字符串是基元,强烈建议改用对象

在你的标记中试试这个

<input type="text" ng-model="searchText" />
<button ng-click="check(searchText)">Check!</button>
{{ searchText }}

我在处理非平凡视图(存在嵌套作用域)时遇到了相同的问题。最后发现,由于java脚本基于原型的继承特性,在开发AngularJS应用程序时,这是一个已知的棘手问题。AngularJS嵌套作用域是通过这种机制创建的。从ng模型创建的值被放置在子范围中,并不是说父范围(可能是注入控制器的那个)看不到该值,如果不使用dot强制原型引用访问,该值也会对父范围中定义的具有相同名称的任何属性进行阴影处理。有关更多详细信息,请查看特定于说明此问题的在线视频,并发表后续评论。

在AngularJS第19页《掌握Web应用程序开发》一书中,写道

避免直接绑定到作用域的属性。双向数据绑定到 对象的属性(在作用域上公开)是首选方法。作为一个 根据经验,在提供给 ng model指令(例如,ng model=“thing.name”)


作用域只是JavaScript对象,它们模仿dom层次结构。根据,作用域属性通过作用域分隔。为了避免这种情况,点表示法应用于绑定ng模型。

我刚刚遇到了使用绑定到body元素的根控制器的问题。然后我使用了ng视图和角度路由器。问题是angular在将html插入ng view元素时总是创建一个新范围。因此,我的“检查”函数是在由我的ng模型元素修改的范围的父范围上定义的

要解决此问题,只需在路由加载的html内容中使用专用控制器。

“如果使用ng模型,则必须在其中添加一个点。”
让你的模型指向一个object.property,你就可以开始了

控制器

$scope.formData = {};
$scope.check = function () {
  console.log($scope.formData.searchText.$modelValue); //works
}
模板

<input ng-model="formData.searchText"/>
<button ng-click="check()">Check!</button>

检查!
当子作用域处于活动状态时会发生这种情况,如子路由或ng重复。 子作用域创建自己的值,并产生名称冲突:


有关更多信息,请参阅此视频剪辑:

使用
而不是
$scope
工作。
函数AppCtrl($scope){
$scope.searchText=“”;
$scope.check=函数(){
console.log(“您键入的“'+this.searchText+””);//使用了“this”而不是$scope
}
}

写入控制台日志

您可以这样做,以便在
ng键中启用搜索,按下输入文本,然后在
ng键中单击图标:

<input type="text" ng-model="searchText" ng-keypress="keyEnter(this,$event)" />
<button ng-click="check(searchText)">Check!</button>

in the controller
$scope.search = function (searchText) {
        console.log(searchText);
    }
    $scope.keyEnter = function (serachText,$event) {
        var keyCode = $event.which || $event.keyCode;
        if (keyCode === 13) {//KeyCode for Enter key
           console.log(searchText);
        }
    }

检查!
在控制器中
$scope.search=函数(searchText){
console.log(searchText);
}
$scope.keycenter=函数(serachText$event){
var keyCode=$event.which | |$event.keyCode;
如果(keyCode==13){//keyCode用于输入键
console.log(searchText);
}
}

>P>我遇到了同样的问题,这是因为我没有在我的控制器顶部首先声明空白对象:

$scope.model = {}

<input ng-model="model.firstProperty">
$scope.model={}

希望这对你有用

对我来说,通过将我的数据存储到一个对象中(这里是“数据”)解决了这个问题

NgApp.controller('MyController',函数($scope){
$scope.my_title=”“//这在调用的ng click函数中不起作用
$scope.datas={
“我的头衔”:“,
};
$scope.doAction=函数(){
console.log($scope.my_title);//错误值
console.log($scope.datas.my_title);//由“ng-model”绑定的良好值
}

});
因为没有人提到这个问题,所以可以通过向绑定属性添加
$parent
来解决这个问题

<div ng-controller="LoginController">
    <input type="text" name="login" class="form-control" ng-model="$parent.ssn" ng-pattern="/\d{6,8}-\d{4}|\d{10,12}/" ng-required="true" />
    <button class="button-big" type="submit" ng-click="BankLogin()" ng-disabled="!bankidForm.login.$valid">Logga in</button>
</div>

我也有同样的问题。
正确的方法是将“searchText”设置为对象内部的属性

但如果我想让它保持原样,一根绳子呢?嗯,我尝试了这里提到的每一种方法,但没有任何效果。
但后来我注意到问题只出现在初始化中,所以我刚刚设置了value属性,它就成功了

<input type="text" ng-model="searchText" value={{searchText}} />

这样,该值就被设置为“$scope.searchText”值,并在输入值更改时进行更新


我知道这是一个解决办法,但对我来说很有效

我也面临着同样的问题。。。 对我有效的解决方案是使用这个关键字


警报(此.ModelName)

为表单控件提供名称属性

您确定在文档的这一部分中使用此控制器吗?你能举一个最小的失败例子吗?是的,100%确定控制器是好的,这个问题我似乎很熟悉。。。令人惊讶的是,当我将属性名称从
searchText
更改为
search.text
时,它会起作用,你知道为什么吗???@Arthur:这有点不明显,但ng模型只在你的视图中创建了一种局部变量,因此
$scope.model = {}

<input ng-model="model.firstProperty">
<div ng-controller="LoginController">
    <input type="text" name="login" class="form-control" ng-model="$parent.ssn" ng-pattern="/\d{6,8}-\d{4}|\d{10,12}/" ng-required="true" />
    <button class="button-big" type="submit" ng-click="BankLogin()" ng-disabled="!bankidForm.login.$valid">Logga in</button>
</div>
app.controller("LoginController", ['$scope', function ($scope) {
    $scope.ssn = '';

    $scope.BankLogin = function () {
        console.log($scope.ssn); // works!
    };
}]);
<input type="text" ng-model="searchText" value={{searchText}} />