2013-11-26 5 views
5

Ich bin etwas verwirrt darüber, wie man angularjs benutzt, um eine blogähnliche Website zu erstellen.Angularjs - dynamische Seiten, selbe Vorlage, wie man auf Artikel mit ID zugreift und lädt

Wenn Sie einen gewöhnlichen Blog denken ,,, und sagen ,, Ich baue es PHP und MySQL verwenden .. was ich nicht verstehe, ist, wie mache ich Winkel einen Artikel über id erhalten basiert ..

ich kann Daten für eine Liste aller Artikel laden .. I-Daten für eine einzelne Seite laden (von einem statischen json) ,, ich verstehe, wie hTTP-Anfragen senden ,, aber wie greife ich

mysite.com/page?id=1 or 
mysite.com/page?id=2 or 
mysite.com/page?id=3 

Offensichtlich möchte ich die gleiche Vorlage für jeden einzelnen Blogpost laden .. aber ich habe noch kein einziges Beispiel gesehen, das dies einfach erklärt.

Wenn ich drei Posts in meiner Datenbank mit ID 1,2,3 habe, wie soll eckig Links zu jedem einzelnen Artikel generieren? Ich verstehe, dass ich Daten laden kann, um URLs zu assemblieren, aber welche URLs? Ich nehme an, ich bin verwirrt mit dem Routing.

Können Sie ein einfaches und verständliches Beispiel dafür empfehlen? Könnten Sie vorschlagen, darüber nachzudenken?

Danke!

Antwort

10

In dieser kurzen Erklärung werde ich Beispiele auf official tutorial basiert. Vermutlich somwhere in Ihrer Anwendung erstellt Sie Controller-Modul mit Code nahe an:

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

// other controllers etc. 

blogControllers.controller('BlogPostCtrl', ['$scope', 
// more and more of controller code 

Wir kommen wieder hier in einem Moment sein wird :) Wenn Sie Controller-Modul haben, können Sie eine Route zu dem bestimmten Controller verknüpft erstellen:

var blogApp = angular.module('blogApp', [ 
    'ngRoute', 
    'blogControllers' 
]); 

blogApp .config(['$routeProvider', 
    function($routeProvider) { 
    $routeProvider. 
     // other routes 
     when('/post/:postId', { 
     templateUrl: 'partials/blog-post.html', 
     controller: 'BlogPostCtrl' 
     }). 
     // other... 
    }]); 

Nun aber, was wir mit diesem :postId Parameter tun kann? Lässt unseren Controller zurück:

blogControllers.controller('BlogPostCtrl', ['$scope', '$routeParams', 'BlogPost', 
    function($scope, $routeParams, BlogPost) { 
    $scope.post = BlogPost.get({postId: $routeParams.postId}); 
    }]); 

Wie Sie sehen, sind wir $routeParams hier vorbei und dann unsere BlogPost Ressource (es wird erklärt werden). Simplifying (wieder), in $routeParams haben Sie alle Parameter, die Sie in die $routeProvider für die genaue Route setzen (so :postId in unserem Beispiel). Wir haben die ID, jetzt die Magie passiert;)

Zuerst müssen Sie services and/or factories Ihrer App hinzuzufügen (und zu sehen, wir sind mit ngResource):

var blogServices = angular.module('blogServices ', ['ngResource']); 

blogServices.factory('BlogPost', ['$resource', 
    function($resource){ 
    return $resource('action/to/get/:postId.json', {}, { 
     query: {method:'GET', params: { postId: 'all' }, isArray:true} 
    }); 
    }]); 

Jetzt wissen Sie, was unser BlogPost in Controller :) Wie Sie sehen, ist der Standardwert für postId "all" und ja, unsere API sollte alle Posts für postId = "all" abrufen. Natürlich können Sie dies auf Ihre eigene Weise tun und dies auf zwei Fabriken aufteilen, eine für Details und eine für Liste/Index.

Wie alle Blog-Namen gedruckt werden? Ziemlich einfach. Fügen Sie Listenrouting ohne spezielle Parameter hinzu. Sie wissen bereits, wie das geht, also lassen Sie es überspringen und fahren Sie mit unserem Listen-Controller fort:

blogControllers.controller('BlogListCtrl', ['$scope', 'BlogPost', 
    function($scope, BlogPost) { 
    $scope.blogPosts = BlogPost.query(); // no params, so we are taking all posts 
    }]); 

Voila! Alle Beiträge in unserer $scope Variable! Dank dieser Tatsache sind sie zugänglich in der Vorlage/view :) Nun müssen wir nur noch jene Beiträge aus unserer Sicht iterieren, zum Beispiel:

<ul class="blog-posts"> 
    <li ng-repeat="blogPost in blogPosts"> 
     <a href="#/post/{{blogPost.id}}">{{blogPost.title}}</a> 
    </li> 
</ul> 

Und das ist es :) Ich hoffe, Sie AngularJS ganz einfach finden jetzt! Prost!

+0

Vielen Dank! Ich kämpfe immer noch ein wenig, aber es wird einfacher, wenn ich gehe. Ich muss Authentifizierung und ein paar andere Dinge meistern und es wird besser werden. – GRowing

2

Ich denke, was Sie dafür verwenden möchten, ist $ routeParams. Werfen Sie einen Blick auf dieses Video von egghead.io, die erklärt, wie es zu benutzen:

http://egghead.io/lessons/angularjs-routeparams

+0

In diesem Video wird erläutert, wie Parameter an einen Controller übergeben werden. Sie müssen dann diesen Parameter verwenden, um einen AJAX-Aufruf auszuführen, um die Blogdaten oder HTML für den Post-Inhalt abzurufen. – jessegavin

+0

OK, ich sehe, wie ich dies verwenden kann, um meine Links zu erstellen und Parameter zu übergeben. Ich werde damit spielen. Wenn Sie AJAX sagen, beziehen Sie sich auf angularjs $ http? Ich würde es gerne in Aktion sehen, aber dieses Video hilft ziemlich viel. – GRowing

1

Es ist eine gute Praxis Hash-Navigation zu verwenden. So sollte Ihr Routing aussehen dieser

mysite.com/blog/#!/id=1 
mysite.com/blog/#!/id=2 
Verwandte Themen