Untungnya, setiap karakteristik yang Anda cari tersedia dalam bentuk plugin sehingga Anda bahkan tidak perlu mendalami definisi hook Anda sendiri.
Perhatikan bahwa saya menggunakan iron:[email protected]
, ini penting untuk mengikuti perkembangan terbaru, hanya ada dua keanehan kecil saat ini yang saya harap akan segera diperbaiki.
Mari kita mulai dengan publikasi profil pengguna, yang menggunakan nama pengguna sebagai argumen.
server/collections/users.js
Meteor.publish("userProfile",function(username){
// simulate network latency by sleeping 2s
Meteor._sleepForMs(2000);
// try to find the user by username
var user=Meteor.users.findOne({
username:username
});
// if we can't find it, mark the subscription as ready and quit
if(!user){
this.ready();
return;
}
// if the user we want to display the profile is the currently logged in user...
if(this.userId==user._id){
// then we return the corresponding full document via a cursor
return Meteor.users.find(this.userId);
}
else{
// if we are viewing only the public part, strip the "profile"
// property from the fetched document, you might want to
// set only a nested property of the profile as private
// instead of the whole property
return Meteor.users.find(user._id,{
fields:{
"profile":0
}
});
}
});
Mari kita lanjutkan dengan templat profil, tidak ada yang terlalu mewah di sini, kami akan menampilkan nama pengguna sebagai data publik, dan jika kami melihat profil pribadi, tampilkan nama asli pengguna yang kami asumsikan disimpan di profile.name
.
client/views/profile/profile.html
<template name="profile">
Username: {{username}}<br>
{{! with acts as an if : the following part won't be displayed
if the user document has no profile property}}
{{#with profile}}
Profile name : {{name}}
{{/with}}
</template>
Kemudian kita perlu menentukan rute untuk tampilan profil di konfigurasi router global :
lib/router.js
// define the (usually global) loading template
Router.configure({
loadingTemplate:"loading"
});
// add the dataNotFound plugin, which is responsible for
// rendering the dataNotFound template if your RouteController
// data function returns a falsy value
Router.plugin("dataNotFound",{
notFoundTemplate: "dataNotFound"
});
Router.route("/profile/:username",{
name:"profile",
controller:"ProfileController"
});
Perhatikan bahwa iron:router
sekarang mengharuskan Anda menentukan rute dan pengontrol rute di direktori bersama (biasanya ini adalah direktori lib/
di root proyek Anda) yang tersedia untuk klien dan server.
Sekarang untuk bagian tersulit, definisi ProfileController
:
lib/controllers/profile.js
ProfileController=RouteController.extend({
template:"profile",
waitOn:function(){
return Meteor.subscribe("userProfile",this.params.username);
},
data:function(){
var username=Router.current().params.username;
return Meteor.users.findOne({
username:username
});
}
});
Saat iron:router
mendeteksi bahwa Anda menggunakan waitOn
di RouteController
, sekarang secara otomatis akan menambahkan kait loading
default yang bertanggung jawab untuk merender loadingTemplate
saat langganan belum siap.
Sekarang saya akan mengatasi dua bug kecil yang telah saya bicarakan di awal jawaban saya.
Pertama, panduan resmi iron:router
(yang pastinya harus Anda baca) http://eventedmind.github.io/iron-router/ menyebutkan bahwa nama opsi yang harus Anda berikan ke plugin dataNotFound
adalah dataNotFoundTemplate
tetapi pada 28-09-2014 ini tidak akan berfungsi, Anda perlu menggunakan nama lama notFoundTemplate
, ini mungkin akan diperbaiki dalam suatu masalah hari.
Hal yang sama berlaku untuk kode fungsi data
saya di pengontrol: Saya telah menggunakan sintaks kontra-intuitif Router.current().params
untuk mengakses parameter rute padahal biasanya this.params
adalah sintaks reguler yang sesuai. Ini adalah masalah lain yang belum diatasi. https://github.com/EventedMind/iron-router/issues/857
person
saimeunt
schedule
28.09.2014