这是一个有趣的问题,我可以提供一个有趣的解决方法以及我对正在发生的事情的想法。我认为可能存在更好的解决方案,但找到这样的解决方案也被证明是一个挑战。尽管如此,我认为主要问题只是你console.log($templateCache.get('snippet1.html'))
的回归undefined
,因为你$http.get
的 ' 没有首先解决的竞争条件。
检查$templateCache的 api ,我找不到任何有用的方法来了解模板何时通过 ajax 请求解析。要查看简单的问题,请在指令中运行它以查看有关当前存储在您的$templateCache
console.log($templateCache.info())
结果是
对象{id:“模板”,大小:0}
为了观察问题的核心,在指令中运行相同的 JS,但有这样的超时
setTimeout(function() {
console.log($templateCache.info())
}, 1000);
结果是
对象{id:“模板”,大小:2}
很有趣,所以他们就在里面……但现在要处理好他们是个挑战。我制定了以下解决方法,至少暂时给我们一些东西。注入$q
并$rootScope
注入您的.run
功能
myApp.run(['$templateCache', '$http', '$q', '$rootScope', function($templateCache, $http, $q, $rootScope){
$q.all([
$http.get('snippet1.html',{ cache : $templateCache }),
$http.get('snippet2.html',{ cache : $templateCache })
]).then(function(resp){
$rootScope.templateCache = resp
})
}]
);
var
检查这个,你会注意到我在我们$rootScope
的对象上放置了一个任意$rootScope.templateCache
的,目的是$watch
在我们的指令中放置一个。然后在我们的指令中,$templateCache
当我们知道有一个值 on 时,让我们调用我们的$rootScope.templateCache
,表明$q
服务已经解决了我们的承诺
link: function(scope, element, attrs) {
scope.$parent.$parent.$watch('templateCache', function(n, o) {
if(n) {
element.append($compile($templateCache.get('snippet1.html')[1])(scope));
}
});
}
嘿看!我们的模板指令正确呈现。看起来很老套scope.$parent.$parent
是因为在这个指令中,我们已经隔离了我们的scope
,现在需要爬一些梯子来获得定义的值$rootScope
。
我希望我们能找到一种更简洁更简洁的方式吗?当然!但是,希望这可以确定发生这种情况的原因以及目前启动和运行的可能方法。下面提供了工作 plunker。
编辑
这是一种完全不同的方法来解决这个问题,它涉及手动引导
var providers = {};
var $injector = angular.injector(['ng']);
var myApp = angular.module('myApp', []);
$injector.invoke(function($http, $q, $templateCache, $document) {
$q.all([
$http.get('snippet1.html',{ cache : $templateCache }),
$http.get('snippet2.html',{ cache : $templateCache })
]).then(function(resp){
providers.cacheProvider = $templateCache;
angular.bootstrap($document, ['myApp']);
});
});
myApp
.controller('test',function() {
})
.directive('myTemplate', function ($templateCache, $compile) {
return {
restrict: 'EA',
scope: {
snippets: '='
},
link: function(scope, element, attrs) {
element.append($compile(providers.cacheProvider.get('snippet1.html')[1])(scope));
}
};
});