2016-06-28 14 views
2

私のチームは、角度材料のバージョンをv1.0.8からv1.1.0-rc.5にアップグレードしています。我々は<md-select>を持っており、ng-requiredng-changeの機能を持っています。ng-changeとng-requiredで角度材料md-select問題

angular.module('MyApp',['ngMaterial', 'ngMessages']) 
 
.controller('AppCtrl', function($scope) { 
 
    // if I uncomment this line change myChange function gets invoked the first time 
 
    //$scope.myModel = {}; 
 
    $scope.values = [ 
 
    {val:1, des: 'One'}, 
 
    {val:2, des: 'Two'} 
 
    ]; 
 
    $scope.myChange = function(){ 
 
    alert('Changed value'); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-animate.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-route.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-aria.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-messages.min.js"></script> 
 
<script src="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.0-rc.5/angular-material.js"></script> 
 

 
<link rel="stylesheet" href="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.0-rc.5/angular-material.css" /> 
 

 
<div ng-controller="AppCtrl" layout="column" layout-align="center center" ng-cloak="" ng-app="MyApp"> 
 
    <form name="myForm"> 
 
    <md-input-container class="md-block"> 
 
     <label>Favorite Number</label> 
 
     <md-select name="myModel" ng-change="myChange()" ng-model="myModel" ng-required="true"> 
 
     <md-option ng-value="myVal" ng-repeat="myVal in values">{{myVal.val}}</md-option> 
 
     </md-select> 
 
    </md-input-container> 
 
    myModel.des: {{myModel.des}} 
 
    </form> 
 
</div>

このコードの動作を:あなたは、次のコードで見ることができるように、ユーザーが、新しい値を選択したときに、ライブラリの新しいバージョンにアップグレードした後、変更機能は実行されませんAngular Material v1.0.8でうまくいく。

からng-requiredを削除すると、変更機能が実行されます。

trackByと追加することは、ドキュメントに示唆されているように役立ちません。

私たちは何が欠けていますか?

+0

それが奇数である...私は、最新のリリースでCodePenを作成し、それがhttp://codepen.io/camden-kid/pen/Nrpwzz?editors=1010 –

+0

正常に動作しますこんにちは@camden_kidコメントありがとうございます。私はあなたのコードを見ていますが、主な違いは、 'ng-value =" myVal "'を使っている間に ''の 'value =" {{state}} "'を使ったことです。さらに、 'ng-model =" userState "は文字列ですが、' ng-model = "myModel" 'はオブジェクトです。 'ng-value'を' value'に変更すると変更機能が起動しますが、HTMLの '{{myModel.des}}'には何も表示されません。私はまだ何かが欠けていると感じています。 – VincenzoC

答えて

2

次の操作を行うことができます:

<form name="myForm"> 
    <md-input-container class="md-block"> 
     <label>Favorite Number</label> 
     <md-select name="myModel" ng-change="myChange()" ng-model="selected" ng-required="true"> 
     <md-option ng-value="$index" ng-repeat="myVal in values">{{myVal.val}}</md-option> 
     </md-select> 
    </md-input-container> 
    myModel.des: {{values[selected].des}} 
    </form> 

ng-changeを選択変更でトリガされます。

angular.module('MyApp',['ngMaterial', 'ngMessages']) 
 
.controller('AppCtrl', function($scope) { 
 
    $scope.values = [ 
 
    {val:1, des: 'One'}, 
 
    {val:2, des: 'Two'} 
 
    ]; 
 
    $scope.myChange = function(){ 
 
    alert('Changed value'); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-animate.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-route.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-aria.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-messages.min.js"></script> 
 
<script src="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.0-rc.5/angular-material.js"></script> 
 

 
<link rel="stylesheet" href="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.1.0-rc.5/angular-material.css" /> 
 

 
<div ng-controller="AppCtrl" layout="column" layout-align="center center" ng-cloak="" ng-app="MyApp"> 
 
    <form name="myForm"> 
 
    <md-input-container class="md-block"> 
 
     <label>Favorite Number</label> 
 
     <md-select name="myModel" ng-change="myChange()" ng-model="selected" ng-required="true"> 
 
     <md-option ng-value="$index" ng-repeat="myVal in values">{{myVal.val}}</md-option> 
 
     </md-select> 
 
    </md-input-container> 
 
    myModel.des: {{values[selected].des}} 
 
    </form> 
 
</div>

+0

レスポンスありがとうございます。このコードでは物質 ''が使用されていて、角度のある「選択」は使用されていません。 _anオプション要素は文字列values_にのみバインドできますか?このディレクティブに対しても制限は有効ですか?とにかく、より正確な答えが得られない場合(例えば、 'ng-required'とprevoiusバージョンなしで動作する理由を説明するなど)、私はこれを受け入れられた答えとして選びます。 – VincenzoC

+0

@VincenzoC 'md-select'(https://material.angularjs.org/latest/api/directive/mdSelect)のドキュメントを見てください*オブジェクトをオプション要素として使うことは可能ですが、 'nd-model-options =" {trackBy: '$ value.val'} ''を 'md-select'に追加してください。それを試しましたが(http://codepen.io/camden-kid/pen/Nrpwzz?editors=1010)、運はありません。 'ng-required'が' md-select'を破っているようです。最新リリースのバグかもしれません。問題はAngular 2のAngular Materialで作業しているので、今では本質的ではないバグを修正しているようには見えないということです。 –

+1

角度素材v1.1.0-rc.5に関連する問題であることを確認します。新しいリリース(1.1.0)を使用すると、この問題は修正されたようです。 – VincenzoC