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

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

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

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

AngularJS

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

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

2回答

3215閲覧

初心者によるMonacaでの英語並び替え問題制作

jun9

総合スコア23

JavaScript

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

AngularJS

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

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

0クリップ

投稿2020/12/05 12:29

前提・実現したいこと

当方現在monacaでAngular jsを用いた英語のクイズアプリを作成しております。
その上で以下のような英語の並び替え問題を作成したいと考えております。

①ランダムに並べられた単語ボタンをクリックすると順にtextareaに単語が入力される。
②単語がクリックされるとその単語ボタンが非表示になる。
③"1語戻す"ボタンをクリックすると単語ボタンをクリックした順にtextareaから入力された
単語を削除、同時に単語ボタンの再表示。

現在①②の実装は完成したのですが③の実装をどのような方法で進めればよいか分からず困っております。ネットで検索を繰り返しましたが、分からず埒が明かないため、この場で質問させていただこうと考えました。

どのような方法を用いればよいかを教えていただければ幸いです。よろしくお願いいたします。

イメージ

イメージ説明

該当のソースコード

html

1<ons-page> 2 <div ng-controller="gameCtrl as game"> 3 <ons-toolbar> 4   <div class="center"> 5 試作 6   </div> 7 </ons-toolbar> 8  <div class="question"> 9 <p> 10 {{game.items.currentQ.text}} 11 </p> 12 </div> 13 <div class="answerForm"> 14 <textarea class="textarea" style= "font-size:20px"; id="hoge" name="text" ></textarea> 15 </div> 16 <div class="choices"> 17    <ons-row> 18 <div ng-repeat="choice in game.items.currentQ.choices track by $index"> 19 <div class="choice"> 20 <button class="button" id="{{$index}}" ng-click="game.add($index);game.hide($index)">{{choice}}</button> 21 </div> 22 </div> 23  </ons-row> 24  </div> 25 <div class="bottom"> 26 <button class="button" ng-click="game.back()"> 27 1語戻す 28 </button> 29 </div> 30 </div> 31</ons-page>

JavaScript

1var app = angular.module('myApp',['onsen']); 2app.controller('gameCtrl',function(questionsService,$scope){ 3 var me = this; 4 me.items = {}; 5 var rightNum = 0;// 6 var anserNum = null; 7 var questions = null; 8 9 var init = function(){ 10 me.items.currentNum = 0; 11 questions = JSON.parse(JSON.stringify(questionsService.questions)); 12 me.items.totalNum = questions.length; 13 questionInit(); 14 } 15 16 var questionInit = function(){ 17 var currentQ = questions[me.items.currentNum];/ 18 var qLength = currentQ.choices.length; 19 me.items.currentQ = currentQ; 20 }; 21 22 23 me.add=function($index){ 24 document.getElementById('hoge').value+=me.items.currentQ.choices[$index]; 25 }; 26 27 me.hide=function($index){ 28 document.getElementById(`{$index}`).style.visibility="hidden"; 29 }; 30 31 me.back=function($index){ 32 document.getElementById(`{$index}`).style.visibility="visible"; 33 }; 34 35 init(); 36});

JavaScript

1// service 2app.value('questionsService', { 3 questions : [ 4 { 5 "text": "あなたは毎日英語を勉強しなければなりません。", 6 "answer": "You must study English every day ", 7 "choices": ["You ","English ","must ","every ","study ","day "] 8 }, 9 ] 10});

試したこと

me.back=function(){
document.getElementById({$index}).style.visibility="visible";
};

上記のように入力しましたが、直前にクリックした単語ボタンのindexを記憶していないため、当然うまくいきません。どのような方法を用いれば実現できるでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

答えの単語の順番、単語の表示・非表示を配列で管理し、textareaはng-model、buttonはng-disabledを使用して制御すれば実現できます。

HTML

1<ons-page ng-controller="gameCtrl as game"> 2 <ons-toolbar> 3   <div class="center"> 4 試作 5   </div> 6 </ons-toolbar> 7  <div class="question"> 8 <p> 9 {{game.items.currentQ.text}} 10 </p> 11 </div> 12 <div class="answerForm"> 13 <textarea class="textarea" style= "font-size:20px"; id="hoge" name="text" ng-model="game.answer"></textarea> 14 </div> 15 <div class="choices"> 16    <ons-row> 17 <div ng-repeat="choice in game.items.currentQ.choices track by $index"> 18 <div class="choice"> 19 <button class="button" id="{{$index}}" ng-click="game.choiceWord($index)" ng-disabled="game.items.currentQ.status[$index]">{{choice}}</button> 20 </div> 21 </div> 22  </ons-row> 23  </div> 24 <div class="bottom"> 25 <button class="button" ng-click="game.back()"> 26 1語戻す 27 </button> 28 </div> 29</ons-page>

JavaScript

1app.controller('gameCtrl',function(questionsService,$scope){ 2 var me = this; 3 me.items = {}; 4 me.answer = ""; // textareaの答え 5 var rightNum = 0;// 6 var anserNum = null; 7 var questions = null; 8 9 var init = function(){ 10 me.items.currentNum = 0; 11 questions = JSON.parse(JSON.stringify(questionsService.questions)); 12 me.items.totalNum = questions.length; 13 questionInit(); 14 } 15 16 var questionInit = function(){ 17 var currentQ = questions[me.items.currentNum]; 18 var qLength = currentQ.choices.length; 19 me.items.currentQ = currentQ; 20 me.answer = ""; // textareaの答え 21 me.items.currentQ.answer = []; // 答えの単語の順番 22 me.items.currentQ.status = []; // 単語の選択有無 23 for (var i = 0; i < qLength; i++) { 24 me.items.currentQ.status.push(false); 25 } 26 }; 27 28 me.showAnswer = function () { 29 var answer = ""; 30 for (var i = 0; i < me.items.currentQ.answer.length; i++) { 31 answer += me.items.currentQ.answer[i][1]; 32 } 33 me.answer = answer; 34 }; 35 36 me.choiceWord = function (index) { 37 me.items.currentQ.answer.push([index, me.items.currentQ.choices[index]]); // 選択した単語を追加 38 me.items.currentQ.status[index] = true; // 単語を非表示 39 me.showAnswer(); 40 }; 41 42 me.back = function () { 43 var len = me.items.currentQ.answer.length; 44 if (len > 0) { 45 var index = me.items.currentQ.answer[len - 1][0]; 46 me.items.currentQ.status[index] = false; // 単語を表示 47 me.items.currentQ.answer.pop(); // 一番最後の単語を削除 48 me.showAnswer(); 49 } 50 }; 51 52 /*me.add=function($index){ 53 document.getElementById('hoge').value+=me.items.currentQ.choices[$index]; 54 }; 55 56 me.hide=function($index){ 57 document.getElementById(`{$index}`).style.visibility="hidden"; 58 }; 59 60 me.back=function($index){ 61 document.getElementById(`{$index}`).style.visibility="visible"; 62 };*/ 63 64 init(); 65});

投稿2020/12/06 14:26

otak-lab

総合スコア276

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

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

jun9

2020/12/16 13:22

otak-labさん こんにちは。ご回答いただきありがとうございました。お教えいただいた通り、ng-model、ng-disabledディレクティブを用いることで、表示/非表示を実現させることができました。しかし、配列の管理で分からない点があります。 (Javascriptのme.showAnswer部分) for (var i = 0; i < me.items.currentQ.answer.length; i++) { answer += me.items.currentQ.answer[i][1]; } この部分の[i][1]はどのような働きをしているのでしょうか。この部分で"answer"にクリック時の単語がt追加されるのは分かるのですが、仕組みがいまだに理解できません。再度ご回答いただければ助かります。
otak-lab

2020/12/16 13:41

me.items.currentQ.answerの配列は、選択した単語のindex([0])と単語([1])が入っています。例えば、 [0,You][2,must][4,study]と3つ選択した場合、me.items.currentQ.answer.lengthは3なので、forループで選択した順番に単語([1])を結合して、 "You must study"という答えを作成します。
jun9

2020/12/31 08:57

お返事が遅くなり申し訳ありません。ご説明いただいた内容を理解し、この問題を解決させることができました。ご回答いただいたお二人に感謝いたします。
guest

0

addの時に配列に$indexをpushし、
backの時に配列の最後の要素を参照すれば良いのではないでしょうか。

Angular が分からないため下のコードはイメージです

js

1// 選択されたindexの順番を記録する配列 2me.indexOrder = [] 3 4me.add = function($index) { 5 // push 6 me.indexOrder.push($index) 7 document.getElementById('hoge').value += me.items.currentQ.choices[$index] 8} 9 10me.back = function() { 11 // pop 12 const index = me.indexOrder.pop() 13 document.getElementById(`{index}`).style.visibility="visible"; 14 15 const hoge = document.getElementById('hoge') 16 // 空白区切りで配列にして最後の単語をpopで削除 17 let text = hoge.value.split(" ") 18 text.pop() 19 // 空白区切りの文字列にする 20 text = text.join(" ") 21 hoge.value = text 22}

趣旨とはずれますが、$indexが数値だと、そのままIDに指定するのは大丈夫なのかなという気がします。

投稿2020/12/05 16:07

neko_daisuki

総合スコア2090

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問