2016-05-29 18 views
1

これはおそらく以前は答えられていましたが、私は現在運が良ければ48時間後に答えを探しました。これを掲示することは最後の手段です。ng-bind-htmlでDOMに追加された要素へのアクセス

だから私はこのテトリスクローンを持っており、ここに見られるように、それは動作します:私は、全体を再コーディングしています

http://www.crawfordcomputing.com/AkadineWebOS/

http://www.crawfordcomputing.com/portfolio/Jetris.php

しかし、それは、この単一ページの角アプリでは動作しません。 AngularJSのシングルページアプリにすることができます。この目的のために、ng-bind-htmlを介してhtmlを読み込み、コンパイルディレクティブはAngularJS directive in ng-bind-htmlにあります。

私が拘束しているhtml文字列は正確です:編集:キャンバスを子ノードにしようとしましたが、うまくいかなかった。

必要なスクリプト<div><canvas id='gamewindow' width='780px' height='560px'></canvas></div>は、ここで見つける機能を経由してロードされます。Single page application - load js file dynamically based on partial view

注:放火犯を使用してvar jetris = { startgame: function(), ...};

、私はすべての添加元素とスクリプトを見ることができます:html5jetris.jsは実際にはオブジェクトでありますDOM。私はまた、閉じた後にwindow.onload = jetris.startGame;を使用することができない単一のページが既にロードされていると仮定しています。 var jetris = {};

1)私はalert("hello");を最後の行(startGameの呼び出しの直前)に置いてみました。そして、firebugでステップアップを試みました。 html5jetris.jsがロードされている間は実行されていないようです。

2)アドレスバーから直接idでキャンバスにアクセスしようとしました。javascript:getElementByID("gamewindow").innerHTML = "hello"; 成功しませんでした。これは、ng-bind-htmlが1-1.5秒を超えて実行された後、数秒後にロードされました。

3)私がindex.php内のすべてのjをあらかじめemptivlyロードすると、firefoxがそれを処理します。しかし、私は必要な時だけjavascriptをロードしたい。これは、IDでキャンバスにアクセスできないことを修正しません。

4)それによって、Jetrisが動作し、AngularJSによって動的にロードされません。

注:JetQueryは、Angularの場合でもjQueryを必要としません。これは、自分のutitlty.js(オブジェクトに変換されたjavascriptクラスの一部として作成されます:var U = {};)と独自のhtml5canvas.js(やはりvar canvas = {};)これらはオブジェクトなので、変数はjQueryまたは角度。

アイデア?ここ

はディレクティブです:

.directive('compile', ['$compile', function ($compile) { 
return function(scope, element, attrs) { //taken from Joël (Thank you!) source: https://stackoverflow.com/questions/26594153/angularjs-directive-in-ng-bind-html 
    scope.$watch(
     function(scope) { 
      // watch the 'compile' expression for changes 
      return scope.$eval(attrs.compile); 
     }, 
     function(value) { 
      // when the 'compile' expression changes 
      // assign it into the current DOM 
      element.html(value); 

      // compile the new DOM and link it to the current 
      // scope. 
      // NOTE: we only compile .childNodes so that 
      // we don't get into infinite loop compiling ourselves 
      $compile(element.contents())(scope); 
     } 
    ); 
}; 

}])

Jetris.php:

<?php //Jon Crawford AkadineWebOS pages/jetris.php 

//describe window 
$window = array(); 
$window['content'] = "<canvas id='gamewindow' width='780px' height='560px'></canvas>"; 
$window['title'] = "Jetris"; 
$window['x'] = 20; 
$window['y'] = 250; 
$window['id'] = 900; 
$window['requireJS'] = array(); 
$window['requireJS'][0] = "scripts/html5Jetris.js"; 
$window['requireJS'][1] = "scripts/html5Canvas.js"; 
$window['requireJS'][2] = "scripts/utilities.js"; 

echo json_encode($window); 
?> 

これは、タイトルバーとドラッグ可能である終了ボタンを持つdiv要素にロードされます。私のメニューシステムは、次のようなアイコンです。私のAkadineWebOSは普通のデスクトップのようです。私はabout.phpとwelcome.phpを持っていますが、私のdiv-windowsではうまく動作します。

+0

ロードなどを処理するためのディレクティブを作成できます。ディレクティブconstrutorを使用すると、使用するスクリプトの要素を見つけることができる要素にアクセスできます。 – MiltoxBeyond

+0

HTMLを読み込むために使用するディレクティブを追加しました。私はこれを使ってすべてのコンテンツをdivにロードします。私はjetris.phpを追加して、データの送信方法を確認することもできます。これは非常に動的ですが、私が設定したコンテンツオブジェクトでは、特定のディレクティブを指定するために使用できる変数を追加できます。私は自分のウェブサイトに持っているものをアップロードすることを検討しているので、その要点を見ることができます。 –

+0

また、私はこれを高度にカスタマイズ可能にしようとしており、究極的には精通しているコーディングではない他の人が使用するようにしています。だから、私はデータベースと管理者のログインを使って新しいページを追加できるようにしたい。 jsfiddleのようにコードがアップロードされ、作成されたアプリケーションはウェブサイトのコードに決して落とされません。したがって、指示に1つを追加することは理想的ではありません。私はリンク先のホストにアップロードしたものの、PDOに問題があり、mySQLiに再コーディングして後ろに行きたいとは思わない。申し訳ありませんが、そのリンクを少し待たなければなりません。 –

答えて

0

これは特別なケースですので、私はおそらく私の質問を明確にしませんでした。ここに私の目標を達成するために使用した手順があります。私はジョエル(!ありがとう)ソースによって$コンパイルディレクティブを使用DOMにHTMLフォーマットされた文字列をロードするに

:外部依存関係のスクリプトファイルをロードするにはAngularJS directive in ng-bind-html

は、私は(ベンThielkerによってロードスクリプト機能を使用しましたありがとう)ソース:!私は新しいゲームを追加したいか、いつでも私は私の角度アプリをコードし直す必要はありませんようにvar externalJS = { run: function() { window.jetris.startGame(); } };

Single page application - load js file dynamically based on partial view

は、その後、私はに私のJavaゲームJetrisにonloadイベントを変更他のjavascriptアプリ、これは私のアプリがvarのexternalJSがあるかどうかをチェックすることができます定義されていない場合は、externalJS.run();を実行します。アプリのdivウィンドウが閉じている場合、再オープンすると効果的に再起動します。

すべてがAngularのHTTPモジュールを使用してロードされているので、すべてのロードが完了するまでAngularsの処理が完了するまで待つ必要があります。私はすぐにそれを実行しようとすると、空白のウィンドウとゲームを取得します。そのために、HTTPモジュールのsuccessCallbackにある程度の時間を与えるために、

setTimeout(function() { 
if (typeof externalJS != 'undefined'){ 
    externalJS.run(); 
}},750); 

を使用します。

ここにはプロジェクトのアルファのリンクがありますが、ここで質問されたすべての問題が解決しました。 oneInstanceフラグがJetrisのように設定されていない限り、ウィンドウとアイコンをドラッグして、通常のデスクトップのように複数のウィンドウを開くことができ、Jetris!見てみな! AkadineWebOS

Triva:私は、数年前にランダムな読みやすい単語(実際には読みにくい)を作成したプログラムでオンラインのハンドルとして頭字語Akadineを作成し、最近は高度なキオスクとダイナミックインターネットナビゲーション環境を使用しました。

関連する問題