在输入更改事件时,控制器中的范围变量和模板上相同变量的插值不同

时间:2017-04-25 16:58:52

标签: angularjs controller angular-ui-router angularjs-scope

我有一个带有两个路由/模板登录和主要的应用程序。登录模板的用户输入值绑定到两个范围变量Tileusername。在应用启动时,范围变量用'abc'和false初始化。

问题 - >

控制器功能始终绑定到相同的初始值  在应用程序启动时给出它不反映范围变量  在登录模板上被更改

在标记上使用{{}}来查看绑定是否正确发生,  插值部分实际上反映了被改变的值。

如果做错了请帮忙。

isAdmin

登录模板:

app.controller('appController', function() {

 $scope.username = "abc"
 $scope.isAdmin = false;

this.radioChange = function() {
 console.log($scope.isAdmin)  // consoles initialized value always
}

this.textChanged = function() {
 console.log($scope.username) // doesn't reflect changed value, shows "abc"
}
})

index.html

 <input type="radio" ng-model="isAdmin" ng-value="true" ng-
  change="ctrl.radioChange()">
 <input type="radio" ng-model="isAdmin" ng-value="false" ng-
  change="ctrl.radioChange()">

<input type="text" ng-model="username" ng-change="ctrl.textChanged()">

{{isAdmin}}  // view binded correctly to change
{{username}} 

的app.config

 <body ng-controller="appController as ctrl">
     <ui-view> </ui-view>  
 </body>

1 个答案:

答案 0 :(得分:1)

这似乎正在发生,因为登录模板代码的范围(父级)与appcontroller范围(子级)不同。

虽然子范围可以从父级读取属性,但是对这些属性的更改(特别是基本类型)会在子范围上创建新属性。

从身体中删除appController,而不是使用通过路线完成的控制器关联(您部分拥有):

 var login = { name: 'login', url: '/', controller='appController as ctrl', 
                templateUrl: 'login.html'}

 $stateProvider.state(login);

如果使用控制器作为方法,最好避免范围,因此输入变为 <input type="text" ng-model="ctrl.username" ng-change="ctrl.textChanged()">

最后,这将有助于您了解范围继承问题https://github.com/angular/angular.js/wiki/Understanding-Scopes