关于javascript:使用js bookmarklet制作角度应用程序

make an angular app with js bookmarklet

我正试图通过点击JS书签使一个AngularJS应用程序走出一个网站。

问题是NG控制器无法通过角度识别并抛出此错误:

1
Error: Argument 'LDController' is not a function, got undefined

首先,我定义了ng应用程序,并使用了同名的angular.module,这是可行的,我得到了。然后我用application.js的名称加载一个外部文件。此文件中定义了app.controller('LDController', ..)

我做错了什么?下面是JS bookmarklet代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function loadApp() {
  document.getElementsByTagName('html')[0].setAttribute('ng-app', 'bookmarklet');

  var div = document.createElement('div');
  div.setAttribute('ng-controller', 'LDController');
  div.innerHTML = '';
  document.body.appendChild(div);

  var js = document.createElement('script');
  js.innerText ="var app = angular.module('bookmarklet', []);";
  document.body.appendChild(js);

  js = document.createElement('script');
  js.setAttribute('src', 'http://example.org/js/application.js');
  document.body.appendChild(js);
}

(function () {
  if (typeof angular === 'undefined') {
    js = document.createElement('script');
    js.setAttribute('src', 'https://ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular.min.js');
    js.onload = loadApp;
    document.body.appendChild(js);
  }
  else {
    loadApp();
  }
}());


我一直在想,您正在通过添加ng-app指令手动初始化angular。这样做的规定方法是不插入ng-app,而是在设置其他所有元素之后,在适当的元素上调用angular.bootstrap。例如:

1
2
3
angular.element(document).ready(function() {
    angular.bootstrap(document, ['bookmarklet']);
}

这里有更多信息


多亏了Ram Rajamony,我已经解决了!

以下是作为gist的解决方案:https://gist.github.com/lpsbetty/5636338