2012-12-12 21 views
23

Bir hizmet aracılığıyla bir JSON dosyasında okumak için angular-resources.js'u nasıl kullanabilirim?Açısal Kaynaklar Hizmetiyle JSON'ta Okuma

Test amacıyla çok basit bir Angular uygulamasında çalışıyorum ve şu an sadece JSON dosyasındaki verileri okumaya çalışıyorum. Bu kodu bir hizmete yerleştiriyorum, böylece sunucu tabanlı bir veri deposunu hareket ettirdiğimizde daha kolay bir şekilde değiştirebiliyorum. aşağıdaki gibi

Benim App ve App.controller beyan şunlardır:

'use strict'; 

// create module for custom directives 
var App = angular.module('App', ['jsonService']); 

// controller business logic 
App.controller('AppCtrl', function AppCtrl($scope, JsonService) { 
    console.log("marker 1"); 

    if (!$scope.jsonData) { 
     console.log("marker 2"); 
     JsonService.getData(function (d) { 
      console.log(d); 
      $scope.jsonData = d; 
      $scope.records = d.length; 
     }); 
    } else { 
     console.log("I have data already... " + $scope.jsonData); 
    } 

    console.log($scope.jsonData); 
}); 

Benim JsonService anda, aşağıdaki gibi tanımlanır:

'use strict'; 

angular.module('jsonService', ['ngResource']) 
.factory('JsonService', function($resource, $filter) { 
    // define the remote service using Angular's $resource module 
    var service = $resource('/data/ProcessModeling-Resources.json', {}); 

    var JsonService = { 
     // calls $resource.query() to retrieve the remote data. 
     getData : function getData(callback) { 
      console.log("marker 3"); 
      service.query(function (data) { 
       console.log("marker 4"); 
      }); 
     } 
    }; 

    return JsonService; 
}); 

alıyorum konsol çıktısı aşağıdaki gibidir:

marker 1 app.js:8 
marker 2 app.js:11 
marker 3 services.js:13 
undefined app.js:21 
TypeError: Object #<Resource> has no method 'push' 
    at copy (http://127.0.0.1:8000/lib/angular.js:556:21) 
    at new Resource (http://127.0.0.1:8000/lib/angular-resource.js:330:9) 
    at http://127.0.0.1:8000/lib/angular-resource.js:386:32 
    at forEach (http://127.0.0.1:8000/lib/angular.js:117:20) 
    at http://127.0.0.1:8000/lib/angular-resource.js:385:19 
    at wrappedCallback (http://127.0.0.1:8000/lib/angular.js:6650:59) 
    at http://127.0.0.1:8000/lib/angular.js:6687:26 
    at Object.Scope.$eval (http://127.0.0.1:8000/lib/angular.js:7840:28) 
    at Object.Scope.$digest (http://127.0.0.1:8000/lib/angular.js:7707:25) 
    at Object.Scope.$apply (http://127.0.0.1:8000/lib/angular.js:7926:24) angular.js:5582 

Hata yaptığımda hata alıyorum

numaralı veriyi çekerken kullanacağım service.query(function (data) { } numaralı çağrıyı (doğru bir şekilde anladığım halde) çağırmam gerekir.

+0

dosyanızdaki veriler, query() yönteminin gerektirdiği bir dizi değil. –

+0

'data' bir' object' dir. İki alanı vardır: {'name': 'Resources', 'children': [...]}. Orada bir dizi var ... bu benim acıma neden olacak mı? –

+0

Evet, yanıtın bir nesneye sarılmamış bir dizi, üst düzey olması gerekir. –

cevap

38

@ pkozlowski'nin tavsiyesini takip ederdim ve yanıtın bir dizi olduğundan emin olurdum. Neyse, işte yorumlarınızda açıkladığınız şeye benzer bir JSON dosyasından veri yükleyen bir örnek. Bu ngResourcekullanır ve bir şeyler araya yardımcı olabilir: isArrayfalse olarak ayarlanır

angular.module('jsonService', ['ngResource']) 
.factory('JsonService', function($resource) { 
    return $resource('cats.json',{ }, { 
    getData: {method:'GET', isArray: false} 
    }); 
}); 

Bildirim o http://plnkr.co/edit/Ofq7Md8udEnIhAPF1NgL?p=preview

hizmet. Kaynak sınıf size bazı yararlı kolaylık yöntemleri verir beri

Uygulamanız ve denetleyici

var app = angular.module('app', ['jsonService']); 

app.controller('ctrl', function($scope, JsonService){ 
    JsonService.getData(function(data){ 
    $scope.name = data.name; 
    $scope.children = data.children; 
    }); 
}); 

getData aslında gerekli değildir böyle bir get yapmanız sadece I varsayıyorum bu

angular.module('jsonService', ['ngResource']) 
.factory('JsonService', function($resource) { 
    return $resource('cats.json'); 
}); 

app.controller('ctrl', function($scope, JsonService){ 
    JsonService.get(function(data){ 
    $scope.name = data.name; 
    $scope.children = data.children; 
    }); 
}); 
+0

Teşekkür ederim @ jm-. Bunu anlamaya biraz yanaştı, ama anladım! Yine de merak ediyorum - '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' • '' '' '' '' '' '' '' '' '' '' '•' '' '' '' '•' '' '' '•' '' '' '•' '' '' '' '•' '' '' '•' '' '' '•' '' '' • '' sorgusu' bir dizi beklediği dışında –

+1

Her ikisi de "GET" istekleri yapma anlamında benzerler, ancak bir kaynağı {{} ve "sorguyu" çoklu kaynakları ['' {}} {}} elde edersiniz. – jaime

+0

Mükemmel; Şimdi anladım! Teşekkürler! –