我正在尝试手动引导我的角度应用,以便以我的应用所依赖的异步方式加载一些数据。见article
问题是无论我尝试什么,我都无法使用angular.injector访问工厂的实例。见plunker
问题是我随时运行这样的代码:
var Injector = angular.injector(["MyAPP", "ng"]);
var initService = Injector.get("MyService");
我只是得到了未知的提供程序错误。
有人可以帮助我使这个plunker工作,或指出我更好的方法来创建一个角度应用程序初始化服务。感谢,
答案 0 :(得分:1)
已修改:已更新,以反映我们在评论主题中的讨论。
要设置initApp()
函数以初始化,使用Promise异步,所需的任何应用程序级别服务,包括工厂(在原始plunker中定义),您只需返回一个Promise,它将在初始注射完成;完成后,调用您的bootstrapApplication()
方法在页面上引导Angular。
function initApp() {
return new Promise(function(resolve, reject) {
var Injector = angular.injector(["ng","plunker"]);
Injector.invoke(['factoryTwo', function(factoryTwo) {
console.log(factoryTwo.test);
resolve();
}]);
});
}
function bootstrapApplication() {
angular.element(document).ready(function() {
angular.bootstrap(document, ["plunker"]);
});
}
initApp().then(bootstrapApplication);
这是一个分叉的plunker的链接,上面的代码片段正常工作:http://plnkr.co/edit/764AqLZf6rQHwPZ1RAZc?p=preview
答案 1 :(得分:0)
您必须在插入页面
之前引导加载的ajax内容在将HTML字符串插入DOM之前,需要在HTML字符串上调用$compile
,以便angular有机会执行绑定。
在你的小提琴中,它看起来像这样。
$("#dynamicContent").html(
$compile(
"<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>"
)(scope)
);
显然,必须将$compile
注入您的控制器才能实现此目的。
在$compile
documentation中阅读更多内容。