Директива AngularJS templateUrl не обновляется

#javascript #angularjs #angularjs-directive

#javascript #angularjs #angularjs-директива

Вопрос:

У меня проблема с директивами angular. Когда я редактирую содержимое файла, на который ссылается через templateUrl , результат не отображается, пока я не удалю кэш. У меня есть следующий код:

Directive.js

 .directive('appMainsec',['$window', function ($window){
    var objectMainSec = {
        restrict: 'A',
        templateUrl: 'partials/app-mainsec.html',
        controller: function (){},
        controllerAs: 'MainSectCtrl',
        link: function ($scope,elemnt,attr){
            elemnt.css('height', ($window.innerHeight - ($window.innerHeight * .25))   'px');
        }
    };

    return objectMainSec;
}]);
  

app-mainsec.html

 <div><h1>Principal</h1></div>
  

и index.html

 ...
 <div app-mainsec></div>
...
  

Когда я меняю <h1>Hi</h1> на <h1>Hello</h1> , представление директивы не обновляется, пока я не удалю кэш.

Комментарии:

1. Я не могу понять, чего вы пытаетесь достичь здесь, где ваш контроллер и ваши привязки для <h1> ?

2. Это не проблема, именно так работает Angular. Если вы хотите, чтобы Hi было Hello, создайте переменную области видимости и поместите ее в свой шаблон.

3. Вам не нужно менять заголовок на «(Решить)», если вы примете ответ, люди увидят, что это решение.

4. @jcubic хорошо, я здесь новичок. еще раз спасибо

Ответ №1:

Причина этого в том, что Angular извлекает файл только один раз в начале. Вы можете попробовать использовать templateUrl как функцию и добавлять временную метку, чтобы каждый раз получать новый URL шаблона.

 templateUrl: function() {
    return 'partials/app-mainsec.html?'    new Date();
}
  

Но, вероятно, она обновит вашу директиву только тогда, когда директива будет скомпилирована.

Комментарии:

1. Стоит отметить, что это отключит кэширование браузером этого HTML-файла.

2. @JonSnow если кэш необходим, то без использования сервера никак. Вам нужно будет просмотреть файл на предмет изменений и отправить уведомление (вы можете использовать websockets), а затем обновить дату в templateUrl. Но я не думаю, что что-то подобное необходимо, потому что что-то подобное предназначено только для разработки. Когда приложение готово, он может заменить функцию строкой.