2016-07-22 7 views
1

Ich benutze AngularJS mit ui.bootstrap und haben eine modale Direktive, die gut funktioniert.

myApp.directive("modalButton", ['$uibModal', function ($uibModal) { 
    return { 
     restrict: "A", 
     scope: { 
      modalUrl: '@', 
      modalModel: '=' 
     }, 
     link: function (scope, element, attrs) { 
      element.bind('click', function() { 
       var modalInstance = $uibModal.open({ 
        templateUrl: scope.modalUrl, // Here I want to use an url instead. 
        controller: 'editDeliveryCtrl as ctrl', 
        resolve: { 
         model: function() { 
          return scope.modalModel; 
         } 
        } 
       }); 
      }); 
     } 
    }; 
}]); 

und verwendet wie:

<button type="button" class="btn btn-xs btn-default" modal-model="ctrl.currentDelivery" modal-button modal-url="@Url.Action("AddDelivery", "ProvisionContract", new {provisionContractId = Model.Id})"> 
    <span class="fa fa-plus" area-hidden="true"></span> 
</button> 

Wenn ein Benutzer klickt auf eine Schaltfläche mit der Richtlinie ein modal dargestellt ist. Jedoch verwende ich MVC.Net und die modals, die ich lade, ist häufig eine Form mit @Html.AntiForgeryToken() oder anderer Code-behind Logik. Also, was ich wirklich will, ist die Vorlage jedes Mal neu zu laden (eine neue Anfrage an den Server).

Ich habe Frage unten gelesen und das kann eine gute Antwort sein, aber was ich wirklich will, ist überhaupt keine Vorlagen zu verwenden. Ich möchte $uibModal, um es stattdessen als brandneuen HTML zu laden.

How to remove angular $modal cache?

Kann ich $uibModal machen laden Sie die Vorlage als brandneue HTML jedes Mal? Mehr wie $.load in jQuery?

+0

Was meinst du mit * brandneuen HTML *? Ändert sich der HTML-Code unter der gleichen URL zwischen den Anfragen? – fracz

+1

Ja, der HTML-Code wird vom Server gerendert und ich möchte ihn jedes Mal abrufen, wenn das Modal geöffnet wird. – smoksnes

+0

Wie wäre es mit 'resolve', um Ihre Vorlage zu erhalten und auf dem Modal anzuzeigen? – svarog

Antwort

1

Alle Vorlagen, die Sie in die Angular-App laden, werden in der $templateCache gespeichert, damit sie beim nächsten Mal nicht heruntergeladen werden.

In Ihrem Fall ist dies nicht das gewünschte Verhalten, da sich der HTML-Inhalt derselben URL im Laufe der Zeit ändern kann.

Daher haben Sie die im Cache gespeicherten URL aus dem Cache zu entfernen, bevor die modalen mit

$templateCache.remove(scope.modalUrl); 

Auch Öffnen finden How to remove angular $modal cache.


Eine weitere Idee ist die $templateCache ‚s Put-Methode außer Kraft zu setzen, damit es nicht einige bestimmte Pfade speichert.

angular.module('yourApp').decorator('$templateCache', function($delegate) { 
    var originalPut = $delegate.put; 
    $delegate.put = function (templatePath, contents) { 
    // specifiy conditions which would tell what paths should not be cached 
    if (templatePath == '/this-should-not-be-cached.html' || templatePath.match(/some-regex/)) { 
     return; 
    } 
    else { 
     originalPut(templatePath, contents); 
    } 
    }; 
    return $delegate; 
}); 

können Sie nicht nur $templateCache deaktivieren, da viele Bibliotheken es verwenden, um die Vorlagen zu speichern, die mit ihnen (z ui-Bootstrap und ähnlichen) versandt werden.

+0

Danke für den Vorschlag, es funktioniert super. Ich habe die Frage gelesen, auf die du dich beziehst (wie im Post erwähnt). Aber ich dachte mir, dass es eine bessere Lösung geben sollte, als den Cache ständig hinzuzufügen und zu entfernen. – smoksnes

+0

Haben Sie es gefunden oder vermuten Sie, dass es existiert? – fracz

+0

I _hoped_, dass es existiert. Ich habe es nicht gefunden. :) Kann ich deine Antwort akzeptieren, ** und ** meine Frage als Duplikat kennzeichnen? – smoksnes

Verwandte Themen