这可能已经被回答过了,但我已经尝试了48个小时,现在找到了与现在运气的答案。发布这是最后的手段。访问使用ng-bind-html添加到DOM的元素
所以我有这样的俄罗斯方块克隆,它的工作原理是在这里看到:http://www.crawfordcomputing.com/portfolio/Jetris.php
但它并不在此单页角应用工作:
http://www.crawfordcomputing.com/AkadineWebOS/
我重新编码全网站是一个AngularJS单页面应用程序。为此,我通过ng-bind-html和这里找到的编译指令加载html:AngularJS directive in ng-bind-html。
我绑定的html字符串正是:编辑:试图使canvas成为一个childnode,没有工作。 <div><canvas id='gamewindow' width='780px' height='560px'></canvas></div>
所需的脚本通过这里找到函数加载:Single page application - load js file dynamically based on partial view
注:html5jetris.js实际上是一个对象:var jetris = { startgame: function(), ...};
使用萤火虫,我可以看到所有添加的元素和脚本DOM。我还假设,作为单页已经加载,我不能在关闭后使用window.onload = jetris.startGame;
“;” var jetris = {};
1)我试着把alert("hello");
作为倒数第二行(就在startGame的调用之前)并尝试用萤火虫进行加速。看起来html5jetris.js在加载时没有运行。
2)我试图通过地址栏直接访问画布与编号javascript:getElementByID("gamewindow").innerHTML = "hello";
没有成功;这是ng-bind-html在1-1.5秒之后执行的几秒钟,它需要角度来加载它。 3)如果我在我的index.php中预先强制加载所有的js,那么firefox将会遍历它。但我只想在需要时加载JavaScript。这不能解决不能通过id访问画布。
4)由它自己,Jetris工作,只是没有动态加载AngularJS。
注:Jetris不需要jQuery,即使它在Angular中。它取决于我自己的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窗口中工作得很好。
您可以创建一个指令来处理加载等。指令构造器允许你访问元素,通过它你可以找到脚本使用的元素 – MiltoxBeyond
我已经添加了用于加载HTML的指令。我用它来加载我的所有内容到一个div。我还添加了我的jetris.php,以便您可以看到我如何发送数据。这是非常动态的,但我猜想在我设置的内容对象中,我可以添加一个可用于指定特定指令的变量。我正在考虑上传我的网站,以便您可以看到它的要点。 –
此外,我正在努力使其具有高度的可定制性,并最终被其他不擅长编码的人使用。所以最后我希望能够通过数据库和管理员登录添加新页面。代码将被上传,像jsfiddle和应用程序,永远不会掉到网站的代码。所以不得不添加一个关闭指令将不理想。我已经将我得到的东西上传到我的主机来链接,但他们遇到了与PDO有关的问题,我不想通过将其重新编码到mySQLi来倒退。对不起,您需要等一会才能看到这个链接。 –