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


当前回答

控制器为版本(推荐)

这里是模板

<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);
}

其他回答

使用this代替$scope也可以。 函数AppCtrl(美元范围){ 美元的范围。searchText = ""; 美元的范围。Check = function () { console.log(“你输入了”+这个。searchText + "'");//使用'this'而不是$scope } } < script src = " https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js " > < /脚本> < div ng-app > < div ng-controller = " AppCtrl " > <输入ng-model = " searchText " / > <按钮ng-click = "检查()">写入控制台日志</按钮> . < / div > < / div >

编辑:在写这个答案的时候,我的情况比这复杂得多。评论结束后,我试图重现它,以理解它为什么有效,但运气不好。我认为以某种方式(不知道为什么)生成了一个新的子范围,这是指那个范围。但如果使用$scope,它实际上引用的是父$scope,因为javascript的词法范围特性。

如果有人有这个问题,以这种方式测试并通知我们,那就太好了。

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

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

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

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

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

我只是在使用绑定到body元素的root_controller时遇到了这个问题。然后我在angular路由器中使用ng-view。问题是,当angular将html插入ng-view元素时,总是会创建一个新的作用域。因此,我的“check”函数是在ng-model元素修改的作用域的父作用域中定义的。

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

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

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