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

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

然后在控制器中(模板和控制器由routeProvider调用):

$scope.check = function () {
    console.log($scope.searchText);
}

为什么我看到视图更新正确,但在控制台未定义时,单击按钮?

谢谢!

更新: 似乎我已经解决了这个问题(之前不得不提出一些变通办法): 只需要把我的属性名从searchText改为search。文本,然后定义空$scope。搜索= {};对象,瞧……但我不知道为什么它能起作用;]


当前回答

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

但如果我想让它保持原样,一个字符串呢?我尝试了这里提到的每一种方法,都没用。 但随后我注意到问题只在初始化中,所以我刚刚设置了value属性,它工作了。

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

这样,值就被设置为'$scope。searchText的值,当输入值改变时,它会被更新。

我知道这是个变通办法,但对我很管用。

其他回答

“如果你使用ng-model,你必须在那里有一个点。” 让你的模型指向一个对象。你就可以走了。

控制器

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

模板

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

这种情况发生在子作用域在类似游戏的子路由或ng-repeat中。 子作用域创建自己的值,并产生名称冲突,如下所示: 详见视频片段:https://www.youtube.com/watch?v=SBwoFkRjZvE&t=3m15s

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

避免直接绑定到作用域的属性。双向数据绑定到 对象的属性(在作用域上公开)是首选方法。作为一个 方法提供的表达式中应该有一个点 Ng-model指令(例如,Ng-model ="thing.name")。

作用域只是JavaScript对象,它们模仿dom层次结构。根据JavaScript原型继承,作用域属性是通过作用域分开的。为了避免这种情况,应该使用点符号来绑定ng-models。

你可以这样做,在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);
        }
    }

由于没有人提到这一点,这个问题可以通过向绑定属性中添加$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>

还有控制器

app.controller("LoginController", ['$scope', function ($scope) {
    $scope.ssn = '';

    $scope.BankLogin = function () {
        console.log($scope.ssn); // works!
    };
}]);

看看这小提琴http://jsfiddle.net/ganarajpr/MSjqL/

我有(我想!)做了你一直在做的事情,看起来很有效。你能检查一下什么对你不起作用吗?