2016-10-06 1 views
0

すでにthisを読んでいます。ここで@ryeballarはng-repeatとcontrollerの範囲が矛盾しているので、問題に答えることができるので、$parent/controller as構文を使用すると問題は解決します。しかし、何とか私の場合、解決策は機能していないようです。 ng-changeはコントローラAsとして宣言しても、まったく呼び出されません。また、それは私に奇妙な出力を与えている。
私は同じのためにplunkerを作成しました。1つの選択の後でng-changeが機能していない

HTMLここ

<tr ng-repeat="item in renew.items"> 
    <td>{{item.deviceId}}</td> 
    <td>{{item.carName}}</td> 
    <td>{{item.regNumber}}</td> 
    <td><input type="radio" name="{{item.deviceId}}" ng-model="renew.foo" ng-value="Monthly" ng-change="renew.updatePref(item, 'Monthly')">Monthly 
    <input type="radio" ng-value="Yearly" ng-model="renew.bar" name="{{item.deviceId}}" ng-change="renew.updatePref(item, 'Yearly')">Yearly 
    </td> 
    <td>{{item.planStatus}}</td> 
</tr> 

は、私は、すなわち毎月一つだけが一度にクリックしたままであるように、毎年同じname = item.deviceIdで作成した2つのラジオボタンがあります。 まず、私はたくさんのことを試しました。最初にMonthlyがチェックされるようにng-valueをtrueに設定します。ng-changeは動作しなくなり、再クリックで呼び出されません。誰でも推測できますか?私が望む正確な動作は、Index.htmlのコメントに記載されています。あなたは、彼らが

app.controller('testCntrl', ['$scope', '$uibModal', function($scope, $uibModal) { 

     var vm = this;// store reference ALWAYS! 

はその後に$スコープのすべての参照を変更し、正常に動作コントローラのプロパティとしての機能を作るとき、あなたがcontrollerAs

を使用しているとき

+1

を使用しますか。これらのネストされた関数呼び出しの中で、 'this'は関数呼び出しの外のプロパティを指すことはありません。 – Claies

+0

また、 '$ scope'と' this'を使って、コントローラ内で関数内だけで混合します – charlietfl

答えて

1

あなたは使用NG-変更、変更イベントこれらの入力の値が常に同じままで決して起こらないを持って、 当初

vm.foo = 'Monthly' 

<input type="radio" name="{{item.deviceId}}" ng-model="renew.foo" ng-value="'Monthly'" ng-click="renew.updatePref(item, 'Monthly')">Monthly 
<input type="radio" name="{{item.deviceId}}" ng-model="renew.bar" ng-value="'Yearly'" ng-click="renew.updatePref(item, 'Yearly')">Yearly 

を変更してください。 使用、あなたもng-value="Monthly"を使用している

var vm = this; 

は、月刊はNG-値のvariable (undefiend)です。それはあなたのコードで間違って何が起こっているかを整理するのは難しいですが、あなたはthis` `の範囲であなたのコード内の問題を持っているように見えるvalue="Monthly" or ng-value="'Monthly'".

Working Demo of Your Code

+0

私はそれを解決しました。あなたの助けを借りて、私の目標とする推測をしてください。 [Here](http://plnkr.co/edit/1MeoCTQUUVi00vklyWeP?p=preview)は解決策ですここに残っている問題は1つだけです。なぜVMはそれが動作しているのですか?私たちは 'var vm = this'を行います。変数の初期値を変数に保存するようにします。そうすればコンテキストが変更されます。初期値が保存されます。なぜここで変わるのですか?私の最高の推測。そのng-repeatはこの値を変更させ、updatePrefはng-repeatのスコープの範囲にはないため、vmを使用しないとupdatePrefは呼び出されません。私は正しい? –

+0

このキーワードは、http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/ – ram1993

+0

ng-repeat transclusionスコープとthis.updatePrefの間には関係がありません。基本的にfooの値は決して変更されないので、変更は行われないので、updatePrefは決して呼び出されません。 – ram1993

0

あなたの主な問題は$スコープに物事を割り当てることですvm

//$scope.selectedDevices = []; 
    vm.selectedDevices = []; 
    //$scope.selected = function(device) { 
    vm.selected = function(device) { 
     if (device.checked) { 
      //$scope.selectedDevices.push(device); 
      vm.selectedDevices.push(device); 
     } 
     //........ 

Generally working demo (not all scope conversions done)

+0

あなたの解決策はモーダル内部にあるラジオボタンでは機能しません。状況は依然として続く。ソリューションを変更してください。 –

関連する問題