3

$ save() 문제에 대한 다른 게시물을 보았지만이를 내 코드와 관련시킬 수 없습니다. 궁극적으로 변경된 후에 새 데이터를 데이터베이스에 저장하려고 시도하는 updateProfile() 메서드가있는 프로필 컨트롤러가 있습니다. 다음과 같이 내 프로필 컨트롤러를 정의

:

angular.module('angularfireSlackApp') 
.controller('ProfileCtrl', function($state, md5, profile) { 
var profileCtrl = this; 
var currentUser = firebase.auth().currentUser; 
profileCtrl.profile = profile; 

// Retrieves the user's email from input field, hashes it, and saves the data to the database 
profileCtrl.updateProfile = function() { 
console.log(profileCtrl.profile); // Profile object exists and is populated as expected 
profileCtrl.profile.emailHash = md5.createHash(currentUser.email); 
profileCtrl.profile.$save(); 
} 
}); 

내 사용자 서비스 :

.state('profile', { 
     url: '/profile', 
     controller: 'ProfileCtrl as profileCtrl', 
     templateUrl: 'users/profile.html', 
     resolve: { 
     auth: function($state) { 
      firebase.auth().onAuthStateChanged(function(user) { 
      if (user == null) { 
       $state.go('home'); 
       console.log("In auth but user NOT valid"); 
      } else { 
       console.log("In auth and user valid"); 
      } 
      }); 
     }, 
     profile: function(Users) { 
      firebase.auth().onAuthStateChanged(function(user) { 
      if (user != null) { 
       console.log("In profile and user valid"); 
       return Users.getProfile(user.uid).$loaded(); 
      } else { 
       console.log("In profile but user NOT valid"); 
      } 
      }); 
     } 
     } 
    }); 

CONSOLE.LOG :

주요 응용 프로그램에서

angular.module('angularfireSlackApp') 
// Provides a means of retrieving User data or list of all Users 
.factory('Users', function($firebaseArray, $firebaseObject) { 
// Provides a means of retrieving User data or list of all Users 
// Create a reference to users that can be used to retrieve an array of users 
var usersRef = firebase.database().ref("users"); 
users = $firebaseArray(usersRef); 


var Users = { 
    // Returns a firebase object of a specific user's profile 
    getProfile: function(uid) { 
    return $firebaseObject(usersRef.child(uid)); 
    }, 
    // Returns the display name of a specific user 
    getDisplayName: function(uid) { 
    return users.$getRecord(uid).displayName; 
    }, 
    // Returns the Gravatar url that corresponds to the user 
    getGravatar: function(uid) { 
    return 'www.gravatar.com/avatar/' + users.$getRecord(uid).emailHash; 
    }, 
    // Returns a firebase array of users 
    all: users 
}; 

return Users; 
}); 

프로필 상태

debug

어떤 이유인지 나는 profileCtrl.profile이라는 오류가 발생합니다. $ save()는 함수가 아닙니다. profileCtrl.profile 객체가 합법적이며 $ save()를 적절히 사용하고 있지만 다른 문제가 무엇인지 파악할 수 없다는 것을 알고 있습니다.

내 직감은 내가 간단한 것을 놓치고 있다는 것이지만 AngularJS와 Firebase에 새로운 것이므로 놀라지 않을 것입니다.

+1

당신은'firebaseObject' 나'FirebaseArray'에서만'$ save'를 호출 할 수 있습니다. 그것들 중 누구라도'profileCtrl.profile'입니다. 자세한 내용은 다음을 참조하십시오. https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-save – Adi

+0

어떤 일이 벌어지고 있는지 더 잘 알 수 있도록 코드를 추가했습니다. 'profile'은 사용자 컨트롤러를 통해 firebaseObject를 반환하는 resolve 메소드의 일부인 종속성입니다. 나는 디버깅을했고, firebaseObject라고 말할 수있는 한 멀리 봤다. –

답변

1

"프로필"상태의 resolve에서 아무 것도 반환하지 않습니다.

당신은 그것으로 해결해야

auth: function($state, $firebaseAuth) { 
    return $firebaseAuth().$onAuthStateChanged().then(function(user) { 
    if (!user) { 
     $state.go('home'); 
     console.log("In auth but user NOT valid"); 
    } else { 
     console.log("In auth and user valid"); 
    } 
    }); // classic situation to use $requiresAuth() 
}, 
profile: function(Users, $firebaseAuth) { 
    return $firebaseAuth().$requireSignIn(); 
} 

또한, 서비스는 $firebaseArray에 대한 참조를 유지하지만, 그것을 사용하고자하는 각각의 컨트롤러를 작성해서는 안됩니다.

아래쪽 측이 일부 변경을해야하지만, 위 쪽은 예측, 유지 보수 코드 :

var Users = { 
    // Returns a firebase object of a specific user's profile 
    getProfile: function(uid) { 
     return $firebaseObject(usersRef.child(uid)); 
    }, 
    // Returns the display name of a specific user 
    getDisplayName: function(uid) { 
     // This is actually an issue to get the name synchronously, but I see no reason why not using the Firebase SDK and fetch a-sync 
     //return users.$getRecord(uid).displayName; 
     return usersRef.child(uid) 
      .child('displayName') 
      .once('value') 
      .then(function (snap) { 
       return snap.val(); 
      }); 
    }, 
    // Returns the Gravatar url that corresponds to the user 
    getGravatar: function(uid) { 
     // Again fetch a-synchronously 
     //return 'www.gravatar.com/avatar/' + users.$getRecord(uid).emailHash; 
     return usersRef.child(uid) 
      .child('emailHash') 
      .once('value') 
      .then(function (snap) { 
       return 'www.gravatar.com/avatar/' + snap.val(); 
      }); 
    }, 
    // Returns a firebase array of users 
    all: function() { 
     return $firebaseArray(usersRef); 
    } 
}; 

는 또한 새로운 AngularFire의 문서를 참조하십시오 API reference

+0

먼저, 해결 방법을 이야기하자 : 확인이 아웃 : onAuthStateChange : https://firebase.google.com/docs/reference/js/firebase.auth.Auth#onAuthStateChanged $ requireAuth : https : //로 WWW .firebase.com/docs/web/libraries/angular/api.html # angularfire-users-and-authentication-requireauth onAuthStateChange는 (는) 감가 상각 된 $ requireAuth()와 같은 약속을 반환하지 않습니다. 이 상황. 그럼.() 실 거예요. '프로필'종속성은 사용자가 유효 할 때만 반환됩니다. 'auth'는 firebase.auth(). currentUser를 사용하여 사용자를 검색 할 수 있으므로 아무 것도 반환 할 필요가 없습니다. –

+0

P. 이 응용 프로그램은 내가 업데이트하려고하는 구형 AngularFire 튜토리얼에서 가져온 것입니다. 어쩌면 그게 사물이 말이되지 않을 수도 있습니다. 또한 반환되는 내용을보다 잘 이해할 수 있도록 코드에 오류 로그가 업데이트되었습니다. –

+0

Firebase 3 SDK를 사용하고 있지만 Firebase 2 SDK 만 지원하는 AngularFire 1에 대한 링크를 제공했습니다. 추가 한 링크에서'onAuthStateChanged'는 함수를 반환하지만 구독을 취소하는 이유는'$ save'입니다. – idan

관련 문제