可能是愚蠢的问题,但我有我的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。搜索= {};对象,瞧……但我不知道为什么它能起作用;]


当前回答

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

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

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

其他回答

为表单控件提供name属性

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

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

控制器为版本(推荐)

这里是模板

<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>

JS的

angular.module('example', [])
  .controller('myController', function() {
    var vm = this;
    vm.check = function () {
      console.log(vm.searchText);
    };
  });

示例:http://codepen.io/Damax/pen/rjawoO

最好是在Angular 2中使用component。x或Angular 1.5或更高版本

########

旧方式(不推荐)

不建议这样做,因为字符串是原语,强烈建议使用对象

在标记中试试这个

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

这是你的控制器

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

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

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

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

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

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

I came across the same issue when dealing with a non-trivial view (there are nested scopes). And finally discovered this is a known tricky thing when developing AngularJS application due to the nature of prototype-based inheritance of java-script. AngularJS nested scopes are created through this mechanism. And value created from ng-model is placed in children scope, not saying parent scope (maybe the one injected into controller) won't see the value, the value will also shadow any property with same name defined in parent scope if not use dot to enforce a prototype reference access. For more details, checkout the online video specific to illustrate this issue, http://egghead.io/video/angularjs-the-dot/ and comments following up it.