0

したがって、チュートリアル ナビゲーション メニューをクリックすると、ng-click="loadNewTutorial($index)" 関数が起動され、すべて正常に動作します。tutorialNumber はインデックス番号によって更新され、現在のビデオの URL が変更されます。唯一の問題は、ビデオが常に 1 クリック遅れているため、DOM で変更が発生する前に video.load()/video.play() が明らかに起動することです。つまり、メニュー項目をクリックして 2 番目のチュートリアル ビデオをロードできますが、最初のチュートリアル ビデオがロードされ、次にクリックすると 2 番目のビデオがロードされ、最初のビデオをもう一度クリックすると 2 番目のビデオで動かなくなるということです。最初のボタンをもう一度クリックするまで。そのため、現在のビデオは正しい URL をロードするのに間に合わず、常に 1 クリック遅れます。video.load() 関数が起動する前に、DOM のビデオの src 属性が変更されるまで待機させるにはどうすればよいですか?

<!DOCTYPE html>
<html ng-app="Tutorials">
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script> 
        <script src="./functions.js"></script>
        <script src="./tutorials.js"></script>
        <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
        <script src="http://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
        <script type="text/javascript" src="./script-ng.js"></script>   
        <link rel="stylesheet" href="main.css"></link>
    </head>
    <body ng-controller="getAnswers">
        <div id="sidebar_left"><div id="header"></div>
            <ul id="nav" ng-repeat="section in sets">
                <li  class="section_title {{section.active}}" >
                    {{section.name}}
                </li>
                <ul><li class="tutorial_title {{tutorial.active}}" ng-click="loadNewTutorial({{$index}})" ng-repeat="tutorial in section.tutorials">{{tutorial.name}}</li></ul>
            </ul><span>{{score}}</span>
            </div>
        <div id="container">
                <video id="video" controls>
                    <source src="{{videoURLs[tutorialNumber]}}.mp4"></source>
                    <source src="{{videoURLs[tutorialNumber]}}.webm"></source>
                    Your browser does not support the video tag.
                </video>
                <br />
                <button id="reset">Replay</button>
            <br />
            <div  id="pannel">
                <div id="base">{{verbs.base}}</div>
                <ul class="answers">
                    <li ng-click="checkAnswer(answer)" ng-repeat="answer in verbs.conjugations" class="{{answer.colorReveal}} answer {{answer.correct}}" id="answer{{$index}}">{{answer.text}}</li>
                </ul>
            </div>
            <br />
            <br />
            <br />
            <div id="warning"></div>
        </div>
    </body>
</html>



angular.module('Tutorials', ['functions', 'tutorials']).controller('getAnswers', function ($scope, $element) {
    $scope.sectionNumber = 0;
    $scope.tutorialNumber = 0;      
            $scope.loadNewVerbs = function () {
            $scope.verbs = conjugate(conjugationsets[$scope.tutorialNumber][$scope.questionNumber]);
            $scope.correct = $scope.verbs.conjugations[0].text;
            fisherYates($scope.verbs.conjugations);
        };
    $scope.checkAnswer = function (answer) { 
        if (false) {//wait for tutorial to pause
            $("#warning").text("Not yet!").fadeIn(300).delay(1400).fadeOut(300);
            return;
        };
        answer.colorReveal = "reveal-color";
        if (answer.text === $scope.correct) {   //if correct skip to congratulations            
            $scope.questionNumber++;
        if(sectionNumber === 0 && $scope.tutorialNumber ===0){  //if first video play congratulations etc
            congrats();
        }
        setTimeout(function () {
            $scope.loadNewVerbs();
            $scope.$digest();
        }, 2000);
        } else { //if incorrect skip to try again msg
            if(sectionNumber === 0 && $scope.tutorialNumber ===0){start(160.5); pause(163.8)}
        }
    };
    $scope.sets = [{
        active:"inactive",
        name: "Conjugation",
        tutorials: [
            {active:"inactive",name: "ㅗ and ㅏ regular"}, 
            {active:"inactive",name:"ㅜ, ㅓ and ㅣ regular"}, 
            {active:"inactive",name:"ㅏ and ㅓ reductive"},
            {active:"inactive",name: "ㅗ and ㅜ reductive"},
            {active:"inactive",name: "ㅣ reductive"}]
    }, {
        active:"inactive",
        name: "Sentence_Building",
        tutorials: [
            {active:"inactive",name:"Particles"}, 
            {active:"inactive",name:"Word Order"}]
    }];
    $scope.video = $("#video").get(0);
    $scope.videoURLs = ["ㅗㅏregular", "ㅜㅓㅣregular"];

    $scope.loadNewTutorial = function (tut) {
        $scope.score = 0;
        $scope.questionNumber = 0;
        if(tut){
            $scope.tutorialNumber = tut;
        }
        video.load();
        video.play();
        video.hasPlayed = true;
        $(video).bind('ended', endVideoHandler);

        $scope.loadNewVerbs();
    };  

    $scope.loadNewTutorial();

    var congrats = function(){
        if ($scope.questionNumber === 1) {start(164.15); pause(166.8); $scope.score++;
        } else if ($scope.questionNumber === 2) {start(167.1); pause(170); $scope.score++;
        } else if ($scope.questionNumber === 3) {
            start(171.1); $scope.score ++;$scope.questionNumber = 0;$scope.tutorialNumber++;
        }
    }   

    function endVideoHandler() {
        $(this).unbind('ended');
        if (!this.hasPlayed) {
            return;
        }
        $scope.tutorialNumber++;
        $scope.$digest();
        this.currentTime = 0;
        $scope.loadNewTutorial();
    }
});

var conjugationsets = [
    ["작다", "놀다", "닦다"],
    ["웃다", "울다", "멀다"]
];
var sectionNumber = 0;
var tutorialNumber = 0;
var questionNumber = 0;


$(function () {

    $("#nav").accordion({
        heightStyle: "content",
        header: ".section_title"
    });


    $("#reset").click(function () {
        currentTutorial.currentVideo.videoObject.currentTime = 0;
        currentTutorial.currentVideo.start();
    });

});
4

2 に答える 2

0

「loadNewTutorial」関数にいくつかの問題があります。

  1. $ scopeパラメーターを引数として使用するべきではありません(関数は$ scope内で定義されているため、デフォルトで$ scopeを関数で使用できます)。

  2. 最初の引数として$scopeを受け取ることが期待されますが、ある場所では現在のスコープで呼び出し、別の場所ではパラメーターなしで呼び出し、ビューでは$ index(最初のパラメータとして、プリミティブ番号に解決されます)。

  3. 呼び出されるたびに、「loadNewVerbs」関数と「checkAnswer」関数を再定義しています。

ほんの数例を挙げると。

于 2013-02-26T19:59:37.610 に答える
0

編集: ここであなたのコードを理解しているかどうかはわかりませんが、loadNewTutorial が $scope を引数として取るのはなぜですか? テンプレートからスコープを渡すことができないため、これが問題の一部であると推測しています。

オリジナル: "loadNewTutorial({{$index}})" は "loadNewTutorial($index)" のはずです。

于 2013-02-26T19:31:30.857 に答える