Angularjs $ http.get (). Затым і прывязкі да спісу

У мяне ёсць спіс, які выглядае наступным чынам:

  • <input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" /> {{document.Name}}
  •  
    

    Я звязваю гэты спіс у маім кантролеры, да гэтага:

    $scope.Documents = $http.get('/Documents/DocumentsList/' + caseId).then(function(result) {
        return result.data;
    });
    

    Калі гэта працуе, я не атрымліваю ніякіх вынікаў. калі я выдаліць затым <�код /> метад, я атрымліваю тры пустыя радкі, што робіць лічыльнік ОК, але не адлюстроўваецца ніякай інфармацыі.

    Я ведаю, што «Everthing» астатняе працуе, так як я раней заселены спіс з JQuery, што я раблю не так?

    Вось адказ ад сервера:

    {Id:3f597acf-a026-45c5-8508-bc2383bc8c12, Name:ZZ_BL0164_Skisse BL0164_945111.pdf, Order:1,…}
    {Id:46f51f1f-02eb-449a-9824-8633e8ae7f31, Name:ZB_BL0201_Firmaattest BL0201_945111.pdf, Order:1,…}
    {Id:fddd1979-c917-4b32-9b83-b315f66984ed, Name:ZA_BL0228_Legitimasjonsskjema BL0228_945111.pdf,…}
    
    49
    Я звычайна выкарыстоўваю .get (...) поспех (функцыя (дадзеныя) {}). можа быць, вы можаце дадаць console.log (вынік) і паглядзець, што ён выдае? Я б таксама пераканацца, што вы называеце URL добра сфармаваны. што caseId?
    дададзена аўтар Eduard Gamonal, крыніца
    Я нешта simmilar на заводзе. Аднак замест таго, каб $ scope.Documents У мяне ёсць уаг mypromise і я паставіў $ scope.Documents у частцы затым/поспех.
    дададзена аўтар Eduard Gamonal, крыніца
    Я нешта simmilar на заводзе. Аднак замест таго, каб $ scope.Documents У мяне ёсць уаг mypromise і я паставіў $ scope.Documents у частцы затым/поспех.
    дададзена аўтар Eduard Gamonal, крыніца
    Я звычайна выкарыстоўваю .get (...) поспех (функцыя (дадзеныя) {}). можа быць, вы можаце дадаць console.log (вынік) і паглядзець, што ён выдае? Я б таксама пераканацца, што вы называеце URL добра сфармаваны. што caseId?
    дададзена аўтар Eduard Gamonal, крыніца
    Вы злучэнні Дакумент у Вашай галіне, але выкарыстоўваючы DisplayDocuments() у НГ паўторамі дзе ж DisplayDocuments() </код > адбываюцца з?
    дададзена аўтар Mark Coleman, крыніца
    Вы злучэнні Дакумент у Вашай галіне, але выкарыстоўваючы DisplayDocuments() у НГ паўторамі дзе ж DisplayDocuments() </код > адбываюцца з?
    дададзена аўтар Mark Coleman, крыніца
    У мяне ёсць служба, якая павінна вярнуць дакументы, таму я хацеў бы пазбегнуць усталявання $ scope.documents у той/поспеху часткі, але падобна, што я павінен зрабіць нешта падобнае.
    дададзена аўтар ruffen, крыніца
    У мяне ёсць служба, якая павінна вярнуць дакументы, таму я хацеў бы пазбегнуць усталявання $ scope.documents у той/поспеху часткі, але падобна, што я павінен зрабіць нешта падобнае.
    дададзена аўтар ruffen, крыніца
    Я паспрабаваў, што добра, проста думаў, што гэта выглядала лепш, і было лягчэй прытрымлівацца, таму я хацеў бы даць ёй ісці. Я бачыў людзей, якія выкарыстоўваюць як, але не магу атрымаць гэты спосаб працы.
    дададзена аўтар ruffen, крыніца
    Я паспрабаваў, што добра, проста думаў, што гэта выглядала лепш, і было лягчэй прытрымлівацца, таму я хацеў бы даць ёй ісці. Я бачыў людзей, якія выкарыстоўваюць як, але не магу атрымаць гэты спосаб працы.
    дададзена аўтар ruffen, крыніца

    7 адказы

    $ HTTP метады вяртаюць абяцанне, якое не можа быць итерированным, таму вы павінны прыкласці вынікі ў галіне бачнасці зменных праз зваротныя выклікі:

    $scope.documents = [];
    $http.get('/Documents/DocumentsList/' + caseId)
      .then(function(result) {
        $scope.documents = result.data;
    });
    

    Цяпер, так як гэта вызначае дакументы пераменная толькі пасля таго, як вынікі будуць абраныя, неабходна ініцыялізаваць дакументы зменнай па размаху загадзя: $ scope.documents = [] . У адваротным выпадку, вашы НГ паўтор падавіцца.

    Такім чынам, НГ-паўтор будзе першым вяртаць пусты спіс, таму што дакументы пусты масіў у першым, але, як толькі будуць атрыманы вынікі, НГ-паўтор будзе працаваць зноў, таму што `documents``have змяніўся ў зваротным выкліку.

    Акрамя таго, вы можаце захацець змяніць вам НГ-паўтору выраз:

  • таму што, калі ваш DisplayDocuments() функцыя робіць выклік на сервер, чым гэты выклік будзе выконвацца ў шмат разоў, з-за $ пераварваюць цыклы.

  • 54
    дададзена
    Я затрымаўся з гэтым на працягу двух гадзін, дзякуй за абмен роднаснага адказу
    дададзена аўтар Naguib Ihab, крыніца
    Вы, напэўна, пераблыталі службу HTTP $ для $ рэсурсаў , які робіць вяртаць (ітэрацыйныя) абяцанне, а абяцаньне аўтаматычна вырашана, калі вынікі вяртаюцца.
    дададзена аўтар Stewie, крыніца
    Я меў на ўвазе, калі вы пішаце $ scope.documents = $ http.get (...) , чым дакументы будзе спасылацца на абяцанне (ад $ д службы), таму што гэта тое, што $ вяртае сэрвіс HTTP, абяцанне.
    дададзена аўтар Stewie, крыніца
    Так што я магу вярнуць толькі абяцанне рамкі, калі я не вяртаю масіў? Displaydocuments ня робіць выклік на сервер, дзякуй за галовы ў любым выпадку.
    дададзена аўтар ruffen, крыніца
    Так, зразумеў, што, але я думаў, што кутні быў у стане вырашыць, што абяцанне автомагіческі? Мабыць я не мае рацыю.
    дададзена аўтар ruffen, крыніца
    Шчыра кажучы не ведаў пра $ рэсурсу, але ён выглядае сапраўды гэтак жа, як тое, што шукае ім для. Дзякуй!
    дададзена аўтар ruffen, крыніца

    $ HTTP метады вяртаюць абяцанне, якое не можа быць итерированным, таму вы павінны прыкласці вынікі ў галіне бачнасці зменных праз зваротныя выклікі:

    $scope.documents = [];
    $http.get('/Documents/DocumentsList/' + caseId)
      .then(function(result) {
        $scope.documents = result.data;
    });
    

    Цяпер, так як гэта вызначае дакументы пераменная толькі пасля таго, як вынікі будуць абраныя, неабходна ініцыялізаваць дакументы зменнай па размаху загадзя: $ scope.documents = [] . У адваротным выпадку, вашы НГ паўтор падавіцца.

    Такім чынам, НГ-паўтор будзе першым вяртаць пусты спіс, таму што дакументы пусты масіў у першым, але, як толькі будуць атрыманы вынікі, НГ-паўтор будзе працаваць зноў, таму што `documents``have змяніўся ў зваротным выкліку.

    Акрамя таго, вы можаце захацець змяніць вам НГ-паўтору выраз:

  • таму што, калі ваш DisplayDocuments() функцыя робіць выклік на сервер, чым гэты выклік будзе выконвацца ў шмат разоў, з-за $ пераварваюць цыклы.

  • 54
    дададзена
    Я затрымаўся з гэтым на працягу двух гадзін, дзякуй за абмен роднаснага адказу
    дададзена аўтар Naguib Ihab, крыніца
    Я меў на ўвазе, калі вы пішаце $ scope.documents = $ http.get (...) , чым дакументы будзе спасылацца на абяцанне (ад $ д службы), таму што гэта тое, што $ вяртае сэрвіс HTTP, абяцанне.
    дададзена аўтар Stewie, крыніца
    Вы, напэўна, пераблыталі службу HTTP $ для $ рэсурсаў , які робіць вяртаць (ітэрацыйныя) абяцанне, а абяцаньне аўтаматычна вырашана, калі вынікі вяртаюцца.
    дададзена аўтар Stewie, крыніца
    Так што я магу вярнуць толькі абяцанне рамкі, калі я не вяртаю масіў? Displaydocuments ня робіць выклік на сервер, дзякуй за галовы ў любым выпадку.
    дададзена аўтар ruffen, крыніца
    Так, зразумеў, што, але я думаў, што кутні быў у стане вырашыць, што абяцанне автомагіческі? Мабыць я не мае рацыю.
    дададзена аўтар ruffen, крыніца
    Шчыра кажучы не ведаў пра $ рэсурсу, але ён выглядае сапраўды гэтак жа, як тое, што шукае ім для. Дзякуй!
    дададзена аўтар ruffen, крыніца

    Promise вярнуўся з $ HTTP не можа быць пераплецены непасрэдна (я не ведаю дакладна, чаму). Я выкарыстоўваю сэрвіс пераварочванне, які выдатна працуе для мяне:

    .factory('DocumentsList', function($http, $q){
        var d = $q.defer();
        $http.get('/DocumentsList').success(function(data){
            d.resolve(data);
        });
        return d.promise;
    });
    

    і звязваюцца з ім у кантролеры:

    function Ctrl($scope, DocumentsList) {
        $scope.Documents = DocumentsList;
        ...
    }
    

    <�Моцны> UPDATE:

    In Angular 1.2 auto-unwrap promises was removed. See http://docs.angularjs.org/guide/migration#templates-no-longer-automatically-unwrap-promises

    26
    дададзена
    Я да гэтага часу не зусім упэўнены, як, але чалавек, ты скончыў сваю галечу. Дзякуй!
    дададзена аўтар Davion, крыніца
    @Davion і хто-то яшчэ цікава, што адбываецца ў гэтым кодзе, $ HTTP вяртае HTTP абяцанне, якое аблягае аб'ект адказу, а не фактычныя дадзеныя. Вось чаму вы не можаце «прывязаць» да яго напрамую. Тут $ д сэрвіс выкарыстоўваецца для стварэння новага абяцанні, што ў цяперашні час дазволенага да фактычным дадзеных. Працуючы з гэтым абяцаньнем, кантролер можа атрымаць на фактычных дадзеных, а не проста адказ HTTP. Дарэчы, $ HTTP <�я> поспех і <�я> Памылка метады састарэлі, таму выкарыстанне <�я>, то </я> у цяперашні час рэкамендуецца.
    дададзена аўтар BitMask777, крыніца

    Promise вярнуўся з $ HTTP не можа быць пераплецены непасрэдна (я не ведаю дакладна, чаму). Я выкарыстоўваю сэрвіс пераварочванне, які выдатна працуе для мяне:

    .factory('DocumentsList', function($http, $q){
        var d = $q.defer();
        $http.get('/DocumentsList').success(function(data){
            d.resolve(data);
        });
        return d.promise;
    });
    

    і звязваюцца з ім у кантролеры:

    function Ctrl($scope, DocumentsList) {
        $scope.Documents = DocumentsList;
        ...
    }
    

    <�Моцны> UPDATE:

    In Angular 1.2 auto-unwrap promises was removed. See http://docs.angularjs.org/guide/migration#templates-no-longer-automatically-unwrap-promises

    26
    дададзена
    Я да гэтага часу не зусім упэўнены, як, але чалавек, ты скончыў сваю галечу. Дзякуй!
    дададзена аўтар Davion, крыніца
    @Davion і хто-то яшчэ цікава, што адбываецца ў гэтым кодзе, $ HTTP вяртае HTTP абяцанне, якое аблягае аб'ект адказу, а не фактычныя дадзеныя. Вось чаму вы не можаце «прывязаць» да яго напрамую. Тут $ д сэрвіс выкарыстоўваецца для стварэння новага абяцанні, што ў цяперашні час дазволенага да фактычным дадзеных. Працуючы з гэтым абяцаньнем, кантролер можа атрымаць на фактычных дадзеных, а не проста адказ HTTP. Дарэчы, $ HTTP <�я> поспех і <�я> Памылка метады састарэлі, таму выкарыстанне <�я>, то </я> у цяперашні час рэкамендуецца.
    дададзена аўтар BitMask777, крыніца

    На самай справе вы атрымліваеце абяцанне на $ http.get .

    Паспрабуйце выкарыстоўваць вынікала паток:

  • <input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" /> {{document.Name}}
  •  
    

    Дзе дакументы Ваш масіў.

    $scope.documents = [];
    
    $http.get('/Documents/DocumentsList/' + caseId).then(function(result) {
        result.data.forEach(function(val, i) { 
            $scope.documents.push(/* put data here*/);
        });
    }, function(error) {
        alert(error.message);
    });                       
    
    6
    дададзена

    Паспрабуйце выкарыстоўваць (поспех) ператэлефанаваць

    $http.get('/Documents/DocumentsList/' + caseId).success(function (result) {
        $scope.Documents = result;
    });
    

    But now since Documents is an array and not a promise, remove the ()

  • <input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" /> {{document.Name}}
  •  
    
    1
    дададзена

    Паспрабуйце выкарыстоўваць (поспех) ператэлефанаваць

    $http.get('/Documents/DocumentsList/' + caseId).success(function (result) {
        $scope.Documents = result;
    });
    

    But now since Documents is an array and not a promise, remove the ()

  • <input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" /> {{document.Name}}
  •  
    
    1
    дададзена