teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

awesomeThings の問題に対して回答。

2016/08/07 09:37

投稿

flied_onion
flied_onion

スコア2604

answer CHANGED
@@ -1,2 +1,47 @@
1
1
  isMyTweet, isMyStartのAuthを、`this.Auth`にした場合どうなりますか?
2
- addThingやdeleteThingの `this.$http`が動作しているならそれで動きそうな気がします。
2
+ addThingやdeleteThingの `this.$http`が動作しているならそれで動きそうな気がします。
3
+
4
+ ---
5
+
6
+ # 追記
7
+ (8/7 18:12)
8
+
9
+ 個人的に興味もあったのでやってみました。
10
+ ```
11
+ ReferenceError: Auth is not defined
12
+ ```
13
+
14
+ の問題は最初に書いた回答の通り、main.component.jsのisMyXX の方でAuthにthisを付けてください。
15
+ (コンストラクタは質問者さんのコードのままで)
16
+
17
+ ```
18
+ isMyStar(thing){
19
+ this.Auth.isLoggedIn() && thing.stars && thing.stars.indexOf(this.Auth.getCurrentUser()._id)!==-1;
20
+ }
21
+
22
+ isMyTweet(thing){
23
+ this.Auth.isLoggedIn() && thing.user && thing.user._id===this.Auth.getCurrentUser()._id;
24
+ }
25
+ ```
26
+
27
+
28
+ ただ私の環境だと、Auth.isLoggedInとかAuth.getCurrentUserとかは、asyncの方が呼ばれてしまっていてエラーはなくなりますけど、うまくは動作してないです。
29
+ そこら辺悩んでて回答が遅れたんですが、とりあえず質問の中にあったもう一つの問題、
30
+ starThing、unstarThingでの awesomeThings が見つからない点に回答します。
31
+
32
+ awesomeThingsを参照しているところがpromiseのsuccess関数内なので、そこでのthisはコントローラではありません。
33
+ jsのクロージャ問題でのよくある解決策と同じですが、変数に代入しておきます。
34
+ ```js
35
+ starThing(thing) {
36
+ var that = this;
37
+ this.$http.put('/api/things/' + thing._id + '/star').success(function(newthing){
38
+ // thatを使う。
39
+ that.awesomeThings[that.awesomeThings.indexOf(thing)] = newthing;
40
+ });
41
+ }
42
+ ```
43
+
44
+ 前述の通り私の環境ではサーバー処理は呼ばれてますけど、クリックしても星の見た目は変わりません。
45
+ (既に、自分の投稿に×が見えている状態なら星の動作もうまくいくと思います。)
46
+ 更新されてるかどうかは、デバッグでstarsみるとかdb見るとかすればできると思います。
47
+