ギークオフィス恵比寿のハッカー養成塾4回目です。Vimやキータイプの訓練も結構進みましたが、今回はAngularのタスクが思ったよりも進んだので自分の中で整理しときます。
投稿者のFacebookプロフィール写真を表示するようにします。標準でFacebookログイン機能があり、名前も引っ張ってきてるということはIDも取得できるはず!となんとなく見立てを立てて臨みます。
ググってみるとFacebook APIでプロフィール画像を色々な大きさで取得する方法というドンピシャな記事があったので参照。
https://graph.facebook.com/ユーザーID/picture
というシンプルな方法で引っ張ってこれる事がわかります。ユーザーIDの部分を投稿者IDに動的に当てはめてあげるようにすればよさげ。
index.jadeを眺めてjavascriptファイルの場所を探す。
script(src=\"javascripts/main.js\")
とあるので、main.jsに記述して有りそう。
message: message,
from: {
id: $scope.myself.facebook_user_id, // jshint ignore:line
name: $scope.myself.fullname
}
それっぽいの見つけました。{{post.from.name}}
で投稿者名を引っ張ってきてるので{{post.from.id}}
でfacebookのユーザーIDを取得できそうです。試しにテキストに吐き出させるとしっかりIDっぽい文字列が表示されているので正解。
あとはHTMLで表示させるだけなので簡単です。Jade記法で書くので
img(src=\"https://graph.facebook.com/{{post.from.id}}/picture\")
としてあげれば正解!のはずだったのですが・・・。
srcで指定した場合、{{post.from.id}}をそのままURLとして処理してしまい、正しく動作しない場合があるのでsrc指定には必ずng-srcで指定します。参考URL:AngularJS API : ngSrc
Facebookのプロフィール画像の表示と非表示を切り替えるボタンを一つつけます。toggleみたいな感じの処理をするにはどうすればいいか。
先人の知恵は偉大ということで、「Angular 表示 非表示 切り替え」でググってみます。まさしく欲しいものが出てきたのでこれがどういう仕組なのかを調べます。参考URL:AngularJSマニュアル:表示の切替えをする
ngShowディレクティブがどうやら鍵のようです。値がfalseのときにCSSクラスの.ng-hide(display:none;)が適用され非表示になる仕組み。つまり上の参考サイトはngClickディレクティブで切り替えたtrue or falseの値を、ngShowに渡してあげているということをやっているわけですね。参考URL:AngularJS API : ngShow
プログラミング知識のある方はもうクリアなんですけど、初心者の僕ははこの魔法の呪文が意味するところがわかりませんでした。
数学が苦手な僕でもa = bというのは「aとbは等しい」と意味することくらいはわかります。でもプログラミングは違うんです。a = b はaにbを代入するという意味らしいです。つまり a = a + bが成り立ちます。
そういやこれ、ドットインストールでやってたんですよね。使い道もよくわからなくてわかりにくかったので軽く読み飛ばしてたんですが、感動の再開です。
条件式 ? 式1 : 式2
という書き方で、条件式がtrueの時は式1を返し、falseの時は式2を返すという仕組みです。参考URL:条件演算子(三項演算子)
switchingというオブジェクトは定義されていないのでfalseです。
これをクリックした時に、まずswitchingは定義されていないのでfalseなので、式2の値trueが帰ってきます。switchingにtrueが代入され、ngShowはtrueとなります。もう1度クリックすると、今度はswitchingはtrueなので式1の値falseが帰ってきて、switchingはfalseになります。ngShowにfalseが渡され、.ng-hideのCSSクラスが適用され非表示になります。クリックするたびにtrueとfalseが切り替わるトグルスイッチができました!というわけですね。面白い。
switching = !switching
論理演算子!をつけることによって、switchingがtrueだった場合はfalseを、falseだった場合はtrueを返すことができます。いや、面白いですねほんと。
入力フォームに文字列を入力したら、当てはまる投稿だけを抽出して表示してくれる感じにします。即座に反映されるとこがAngularっぽい!
進研ゼミよろしく、これドットインストールでみたやつだ!ってやつです。ドキュメント見たら答えがそのまま書いてありました。参考URL:AngularJS API : filter
<input ng-model=\"searchText\">
入力された値はsearchTextで宣言します。(っていう表現でいいのか)ViewとModelを紐付けするっていう感じの説明なので、MVCってどんなモノなのか理解しないとアレですね。よく分かんないので次回。ともかく入力した値をsearchTextで引っ張ってこれそうみたいな感覚で使ってみます。
(ng-repeat=\"post in posts\")
の部分で投稿を引っ張ってきているのでここにsearchTextのフィルターを加えます。
(ng-repeat=\"post in posts | filter : searchText\")
これで動きました。公式ドキュメント通りです。
投稿にURLがあったら自動でリンクを貼るというタスクなのですが、linkyを使うんだろうな―ってとこまでは分かって、実際タグも吐き出させるところまで行ったのですが、プレーンテキストとして出ちゃうんですよね。Jadeの書き方の問題なのかどうなのか。とりあえず次回に回しておきます。