質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

3回答

6869閲覧

最低1つ以上チェックされていない場合はbuttonをdisabledのままにしたい

yuki84web

総合スコア1857

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

0クリップ

投稿2017/06/07 06:53

編集2017/06/07 07:58

html

1<body ng-controller="MyController"> 2 <form name="myForm" novalidate> 3 <input type="text" name="hoge" ng-model="hoge" ng-required="true" ng-change="CheckState()"> 4 <input type="checkbox" name="check1" value="1" ng-model="check1Selected" ng-change="CheckState()"> 5 <input type="checkbox" name="check2" value="1" ng-model="check2Selected" ng-change="CheckState()"> 6 <button type="submit" ng-disabled="myForm.$invalid">送信</button> 7 </form> 8</body>

javascript

1angular.module('myApp', []) 2.controller('MyController', ['$scope', function($scope) { 3 $scope.CheckState = function () { 4 if( !$scope.check1Selected 5 &&!$scope.check2Selected ){ 6 $scope.myForm.$valid = false; 7 } 8 }; 9}]);

やりたいこと:
0. 初期状態ではボタンは使用不可
0. テキストボックスを入力する
0. チェックボックスにチェックを入れる(最低1つ以上にチェックされている状態)
0. ボタンが使用可能になる

現状:
0. 初期状態ではボタンは使用不可
0. テキストボックスを入力する
0. ボタンが使用可能になる(1つもチェックしていない状態)

buttonはformのvalidで使用可否の制御をしていますが、
"$scope.myForm.$valid = false;"でfalseを設定してもbuttonがそれを検知しません。
どのようにすれば正しく制御できますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

以下のコードでひとまず期待する動きになると思います。
(<scirpt>...</script>で手抜きしてます...)

<body ng-controller="MyController"> <form name="myForm" novalidate> <input type="text" name="hoge" ng-model="hoge" ng-required="true"> <input type="checkbox" name="check1" value="1" ng-model="check1Selected"> <input type="checkbox" name="check2" value="1" ng-model="check2Selected"> <button type="submit" ng-disabled="myForm.$invalid || invalidCheckbox()">送信</button> </form> <script> angular.module('myApp', []) .controller('MyController', function($scope){ $scope.invalidCheckbox = function(){ return !$scope.check1Selected && !$scope.check2Selected; }; }); </script>

他にも 'myForm.$setValidity(...)' みたいなやり方もあります。
ご興味あれば調べてみてください。

投稿2017/06/08 10:11

KenichiKANAI

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki84web

2017/06/08 12:46

お陰様で期待通りの動作が実現出来ました。 他の方法についても調べてみようと思います。 ありがとうございました。
guest

0

ネイティブJSでよければ、下記で。

HTML

1<form name="myForm" action="./hoge/"> 2 <input type="text" name="hoge"> 3 <input type="checkbox" name="check1" value="1"> 4 <input type="checkbox" name="check1" value="1"> 5 <button type="submit" name="submitBtn" disabled="disabled">送信</button> 6</form>

JavaScript

1var $formObj = document.forms.myForm; 2var $inputText = $formObj.hoge, 3 $chks = $formObj.check1, 4 $submitBtn = $formObj.submitBtn; 5 6var $chksArr = new Array(0); 7 8var $checkBoxAllCheck = function(){ 9 return $chksArr.every(function(val, index){ 10 return val.checked; 11 }); 12}; 13var $allCheckFunc = function(){ 14 $submitBtn.disabled = !($inputText.value.length > 0 && $checkBoxAllCheck()); 15}; 16 17for (var i = 0; i < $chks.length; i++) { 18 $chks.item(i).onchange = $allCheckFunc; 19 $chksArr.push($chks.item(i)); 20} 21$inputText.onblur = $allCheckFunc;

投稿2017/06/07 15:22

miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki84web

2017/06/07 23:47

ありがとうございます。 コード掲載していませんがバリデートエラー時のメッセージ表示などがありますので 出来ればAngularJSで処理したいのですが、通常のJSの方法も考えます。 ただ、頂いたコードで上手く動かなかったので見直してみます。
guest

0

あまり美しくないですがダミーを使ってcssで処理するとか

HTML

1<style> 2[type=submit]{display:none;} 3[type=button]{display:inline;} 4:checked ~ [type=submit]{display:inline;} 5:checked ~ [type=button]{display:none;} 6</style> 7<form name="myForm" novalidate> 8<input type="text" name="hoge"> 9<input type="checkbox" name="check1" value="1"> 10<input type="checkbox" name="check2" value="1"> 11<input type="button" value="test" disabled> <!--だみー--> 12<input type="submit" value="test"> 13</form> 14

投稿2017/06/07 07:08

yambejp

総合スコア114747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki84web

2017/06/07 23:43

ありがとうございます。 CSSで見せかける方法は思い付きませんでした。 どうしても無理そうな場合に検討してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問