Angolare ha una funzionalità denominata services
che funge da modello per l'applicazione.E 'dove sto comunicando con il mio Rails backend:
servizi/article.js
app.factory('Article', function($resource) {
return $resource('http://localhost:3000/articles/:id', { id: '@id'},
{
'update': { method: 'PUT'}
});
});
Anche se il :id
è specificato alla fine, funziona altrettanto bene per andare dritto al /articles
sentiero. Il id
verrà utilizzato solo dove previsto.
Il resto del lavoro va nel controllore:
controllori/articles.js
app.controller('NewPostCtrl', function($scope, Article) {
$scope.newPost = new Article();
$scope.save = function() {
Article.save({ article: $scope.article }, function() {
// Optional function. Clear html form, redirect or whatever.
});
};
});
originale, ho pensato che la funzione save()
che è reso disponibile tramite $resources
era alquanto automatico. Lo è, ma lo stavo usando male. La funzione predefinita save()
può richiedere fino a quattro parametri, ma sembra richiedere solo che i dati vengano passati al database. Qui, è in grado di inviare una richiesta POST
al mio back-end.
viste/articoli/index.html
<form name="form" ng-submit="save()">
<input type="text" id="title" ng-model="article.title">
<input type="text" id="body" ng-model="article.body">
<input type="submit" value="Submit">
</form>
Dopo avere ottenuto l'impostazione service
correttamente, il resto è stato facile. Nel controller, è necessario creare una nuova istanza della risorsa (in questo caso, un nuovo articolo). Ho creato una nuova variabile $scope
che contiene la funzione che richiama il metodo save
che ho creato nello service
.
Ricordare che i metodi creati nel servizio possono essere denominati come si desidera. L'importanza di questi è il tipo di richiesta HTTP inviata. Ciò è particolarmente vero per qualsiasi app RESTful, poiché la route per le richieste GET
è la stessa delle richieste POST
.
Di seguito è la prima soluzione che ho trovato. Grazie ancora per le risposte. Sono stati utili nei miei esperimenti per imparare come funzionava!
soluzione originale: ho finalmente riparato, quindi vi posto la mia soluzione particolare. Tuttavia, ho solo seguito questa strada attraverso la mancanza di informazioni su come eseguirlo attraverso un angolare service
. Idealmente, un servizio gestirà questo tipo di richiesta http. Si noti inoltre che quando si utilizza $resource
nei servizi, viene fornito con alcune funzioni, una delle quali è save()
. Tuttavia, anche questo non ha funzionato per me.
articoli.js controller
app.controller('FormCtrl', function($scope, $http) {
$scope.addPost = function() {
$scope.article = {
'article': {
'title' : $scope.article.title,
'body' : $scope.article.body
}
};
// Why can't I use Article.save() method from $resource?
$http({
method: 'POST',
url: 'http://localhost:3000/articles',
data: $scope.article
});
};
});
Dal Rails è il backend, inviando una richiesta POST
al percorso /articles
richiama il metodo #create
. Questa è stata una soluzione più semplice per me da capire rispetto a quello che stavo provando prima.
Per capire utilizzando services
: il $resource
consente di accedere alla funzione save()
. Tuttavia, non ho ancora demistificato come usarlo in questo scenario. Sono andato con $http
perché la sua funzione era chiara.
Sean Hill ha una raccomandazione che è la seconda volta che ho visto oggi. Potrebbe essere utile a chiunque stia combattendo con questo problema. Se mi imbatto in una soluzione che utilizza servizi, aggiornerò questo.
Grazie a tutti per il vostro aiuto.