2017-04-25 11 views
0

2つのルート/テンプレートログインとメインを持つアプリがあります。ログインテンプレートのユーザー入力値は、2つの有効範囲変数usernameisAdminにバインドされています。スコープ変数は、アプリケーション起動時に 'abc'とfalseで初期化されます。入力変更イベントで、コントローラのスコープ変数とテンプレート上の同じ変数の補間値が異なる

問題 - >

コントローラ機能は常に は、アプリケーションの起動時に与えられたものと同じ初期値に束縛されます。ログインテンプレートで が変更されているスコープ変数を反映していません

バインドが正しく行われているかどうかを確認するために{{}}を使用しました。補間された部分は実際に変更された値を反映します。

間違っていると助けてください。

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

ログインテンプレート:ログインテンプレートコードがスコープを持っているので

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

index.htmlを

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

app.configを

app.config(['$stateProvider', '$urlRouteProvider', function($stateProvider, 
$urlRouterProvider) { 

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

    $stateProvider.state(login); 
    $stateProvider.state(main); 
    $urlRouterProvider.otherwise('/'); 

    }]) 
+0

と呼ばれているスコープの継承の問題を理解するのに役立ちますか? – Chandermani

+0

@Chandermaniのユーザー名入力テキストが変更されました。変更イベントが発生すると、コントローラーの機能からコンソールされる変数は、常にロード時に初期化された値になります。 {{username}}は値が正しく変更されたことを示します –

答えて

1

は、これが起こっているようですとは異なる親(親)スコープ(子)。

子スコープは親からプロパティを読み取ることができますが、これらのプロパティ(プリミティブ型は特に)を変更すると、子スコープに新しいプロパティが作成されます。 、

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

$stateProvider.state(login); 

また、アプローチとして、コントローラを使用している場合、あなたがスコープを避けるほうが良いでしょう:

ではなく、(あなたが部分的に持っている)の経路を介して行わコントローラの関連付けを使用し、体からappControllerを取り除きますしたがって、入力が最後に <input type="text" ng-model="ctrl.username" ng-change="ctrl.textChanged()">

になり、これは `textChange`はどこhttps://github.com/angular/angular.js/wiki/Understanding-Scopes

関連する問題