2012-11-19 2 views
32

여러 지침이있는 AngularJS 응용 프로그램을 작성 중입니다. 지시어의 템플릿은 별도의 html 파일에 저장됩니다. 이 템플릿을 편집 할 때 브라우저는 다시로드 한 후 변경 사항을 감지하지 않고 항상 캐시 된 버전을 사용합니다. 소스 코드에 대한 다른 모든 변경 사항이 감지되어 다시로드됩니다.지시문 템플릿을 강제로 다시로드하십시오.

템플릿을로드 할 때 AngularJS에서 사용하는 것으로 보이는 $ templateCache는 다소 문제가있는 것 같습니다. 다른 사람이 이런 종류의 문제를했고 경우

$http.get(origAsyncDirective.templateUrl, {cache: $templateCache}) 

내가 궁금 : 나는 AngularJS와 1.0.2의 소스 코드에서 발견 무엇

는하여 compileTemplateUrl()의 일부 라인 4317에서 다음을하다 AngularJS에게 캐시 할시기와 그렇지 않을 때를 알려주는 방법이 있다면.

답변

15

템플릿 캐시는 자바 스크립트 앱이므로 브라우저에 저장됩니다. 실제로 $ 캐쉬를 수동으로 공급하거나 브라우저에서 개발자 도구를 사용하여 템플릿을 캐싱하지 않도록 할 수 있습니다 (프로덕션 환경에서는 캐시가 문제가되지 않습니다). 캐시를 먹이 힘이 들어

:

는이 fiddle에서 작업을 참조하십시오.

내 팀과 나는이 같은 문제에 달려있다 :

는 (정확히,이 문제에 대해,이 Google Groups post에서 인용) 템플릿을 캐싱 브라우저를 중지하십시오. Chrome을 사용하면서 개발을위한 우리의 솔루션은 Developer Tools를 열고 오른쪽 하단에있는 을 선택했습니다. 그런 다음 네트워크 - 캐시 사용 안함을 선택하십시오.

모든 부분/템플릿 캐싱 문제가 수정되었습니다.

+14

재 부하를 야기 번역. –

+2

(더블 코멘트에 대해 유감이지만 더 이상 편집 할 수 없습니다 ...) 매번 템플릿을 다시로드하도록 캐시가 강제로 해킹 된 것처럼 보입니다. 그러나 나는 선택의 여지가 없다고 생각한다. Chrome에서 로컬 크롬 버전의 캐싱을 사용 중지하면 문제가 해결됩니다.웹 사이트를 탐색하는 다른 방문자는 여전히 캐시 된 버전을로드합니다. 따라서 프로덕션 모드의 업데이트는 사용자가 캐시를 지울 때까지 표시되지 않습니다. –

+0

글쎄요, 저는 angularJS 프로젝트를 위해 Yeoman을 사용합니다. 따라서 배치 된 파일의 이름은 접두사가 붙습니다. 따라서 앱의 근본적인 변경 사항이 즉각적으로 인식되므로 캐시가 문제가되지 않습니다 (파일 이름이 다르게 지정됨). 테스트를 위해 Yeoman을 사용하고 모든 자산을 다시로드합니다. –

36

나는 이것이 낡은 질문 인 것을 알고 있지만 간단한 해킹 일 뿐이며, 나를 위해 작동하며 $ templateCache에 아무 것도하지 않아도됩니다.

나는이 문제로 실행 할 때마다 (I 지시어 템플릿에서 볼뿐만 아니라 정적 JSON 파일), I는 URL의 끝에 쿼리 ​​매개 변수를 추가

는 다음과 같이로드 :

... 
templateUrl: "partials/template.html?1", 
... 

때마다 템플릿을 변경하고 다시로드하지 않고 끝에 번호를 증가시킵니다. 브라우저가 이것이 서버에 특별한 것을 의미하는지 여부를 알지 못하기 때문에 캐시 된 것인지 아닌지 변경된 URL을 다시로드해야합니다. 또한 프로덕션 환경에서 파일이 다시로드되는지 확인합니다. 당신이 refreshTemplate 함수를 호출 할 때

+7

많은 템플릿이 있다면 변수를 사용할 수 있습니다 var v = "1"; $ routeProvider.when ('/', {templateUrl : '/pages/home.html?v='+ v, 컨트롤러 : 'HomeCtlr'}); – dpineda

+1

''partials/template.html? " + Date.now()'는 완벽하게 작동했습니다. – mhodges

1
app.controller('someCtrl', function ($scope, $cacheFactory, templateRequest) 
{ 
    $scope.refreshTemplate = function() 
    { 
     var tpl = "<template name>"; 
     $cacheFactory.get('templates').remove(tpl); 
     $templateRequest(tpl).then(function ok(){ 
      console.log("Template "+tpl+" loaded."); 
     }); 
    } 
    ... 
    } 

는 당신은 정말 웹 사이트가 여전히 캐시를로드 검색 사용자로 내 로컬 크롬 버전 크롬에서 캐싱을 사용하지 않도록 내 문제가 해결되지 않는

+0

이것이 왜 대답이 아닌지 잘 모르겠습니다 ... 예상대로 작동합니다 ... – Scriptlabs

관련 문제