2013-05-02 7 views
9

Mam pomoc, aby zapisać json jako plik po stronie klienta here. Kod jest bardzo krótki, jak w tym skrzypcach.Dyrektywa o utworzeniu przycisku [pobierz]

var a = document.createElement('a'); 
a.download = "backup.json"; 
a.href  = url; 
a.textContent = "Download backup.json"; 

document.getElementById('content').appendChild(a); 

Próbowałem utworzyć dyrektywę angularjs tak, aby wywoływała metodę w zakresie, aby uzyskać dane. Wzdłuż tej linii.

module.directive('myDownload', function ($compile) { 
    return { 
     restrict:'E', 
     scope:{ getData:'&getData'}, 
     link:function (scope, elm, attrs) { 
      elm.append($compile(
       '<a class="btn" download="backup.json"' + 
        'href=' + scope.getData() + '>' + 
        'Download' + 
        '</a>' 
      )(scope)); 
     } 
    }; 
}); 

To nie działa. Jak wprowadzić linked fiddle do dyrektywy?

Odpowiedz

14

Jak o coś takiego: Fiddle

Oto kod dyrektywy:

module.directive('myDownload', function ($compile) { 
    return { 
    restrict:'E', 
    scope:{ getUrlData:'&getData'}, 
    link:function (scope, elm, attrs) { 
     var url = URL.createObjectURL(scope.getUrlData()); 
     elm.append($compile(
      '<a class="btn" download="backup.json"' + 
       'href="' + url + '">' + 
       'Download' + 
       '</a>' 
     )(scope)); 
    } 
    }; 
}); 

Kontroler:

module.controller('MyCtrl', function ($scope){ 
    var data = {a:1, b:2, c:3}; 
    var json = JSON.stringify(data); 

    $scope.getBlob = function(){ 
    return new Blob([json], {type: "application/json"}); 
    } 
}); 
+1

chłodny .. bardzo dziękuję !!! – bsr

+1

cóż, jedna mała sprawa jednak. Czy mogę pobrać nowe dane za każdym razem, gdy kliknę link. Zauważyłem, że getBlob() wywołuje tylko raz, na początku. Czy to możliwe? – bsr

+0

W takim przypadku zacznę od powiązania zakresu dyrektywy z dowolnymi danymi w zakresie kontrolera, które mogą zmienić dane, które zostaną podane po kliknięciu łącza. Potem spróbowałbym użyć zasięgu. $ Obejrzyj te powiązane właściwości wewnątrz funkcji linku dyrektywy, aby ponownie wygenerować link do pobierania, gdy tylko którykolwiek z nich się zmieni. Tak to przychodzi na myśl, ale może jest lepszy sposób. – mfelix

2

skończyło się tu stara się rozwiązać podobny problem. na mojej stronie Angular, mam JSON pobrany przez Ajax, który jest renderowany jako HTML, ale chciałem, aby "surowy" JSON mógł być pobrany za pomocą linku.

Problem z podejściem OP i najczęściej głosowanym polega na tym, że HTML DOM jest manipulowany w kontrolerze, co w pewnym stopniu uniemożliwia wykorzystanie MVVM. Myślę, że powodem, dla którego robisz to wszystko, jest to, że Angular blokuje tworzenie linków dla obiektów typu blob (przez oczekujące "niebezpieczne" do wynikowego adresu URL typu blob).

szczęście Angular provides a way to apply a whitelist certain URL prefixes więc nie będą blokowane podczas korzystania URL.createObjectURL() ... w tym przypadku należą blob

tutaj jest moje zdanie na nim działa na JSFiddle