2016-12-12 5 views
1

以下のコードでは、Firebase関数内でAngularJSを使ってトーストを表示しようとしています。関数はshowToast()ですが、定義されていないエラーが発生しています。どんな助けもありがとう、ありがとう!AngularJS - 定義されていない関数

機能:

app.controller('PageCtrl', function($scope, $mdToast, $document) { 
    function showToast() { 
    $mdToast.show(
     $mdToast.simple() 
     .textContent('Simple lala Toast!') 
     .hideDelay(3000) 
    ); 
    }; 
}); 

関数を呼び出すしようとしています。

function signInUser(email, password) { 
    var email = document.getElementById('email-input').value; 
    var password = document.getElementById('password-input').value; 

    auth.signInWithEmailAndPassword(email, password).then(function(value) { 
    // REDIRECT TO THE HOME PAGE AFTER LOGIN 
    //window.location = "#/home"; 
    //location.reload(); 

    showToast(); 

    }).catch(function(error) { 
    var errorCode = error.code; 
    var errorMessage = error.message; 

    if (errorCode == 'auth/invalid-email') { 
     alert('That user does not exist.'); 
    } else { 
     alert(errorMessage); 
    } 
    console.log(error); 
    }); 
} 

全スクリプト:

/* 

INITIALIZATION 

*/ 

// FIREBASE CONFIGURATION 
var config = { 
    apiKey: "AIzaSyA2_fVDRCKhCJ5QueXY-Xb2CxFFuxY-rdU", 
    authDomain: "user-database-d1a70.firebaseapp.com", 
    databaseURL: "https://user-database-d1a70.firebaseio.com", 
    storageBucket: "user-database-d1a70.appspot.com", 
    messagingSenderId: "528331985076" 
}; 

// INITIALIZE FIREBASE 
firebase.initializeApp(config); 
var database = firebase.database(); 
var auth = firebase.auth(); 

// ANGULARJS APPLICATION 
var app = angular.module('FirebaseTest', [ 
    'ngRoute', 'ngMaterial', 'ngMessages' 
]); 

/* 

ROUTES 

*/ 

app.config(['$routeProvider', function ($routeProvider) { 
    $routeProvider 
    .when("/home", {templateUrl: "partials/home.html", controller: "PageCtrl"}) 
    .when("/about", {templateUrl: "partials/about.html", controller: "PageCtrl"}) 
    .when("/faq", {templateUrl: "partials/faq.html", controller: "PageCtrl"}) 
    .when("/nutrition", {templateUrl: "partials/nutrition.html", controller: "PageCtrl"}) 
    .when("/login", {templateUrl: "partials/login.html", controller: "PageCtrl"}) 
    .when("/register", {templateUrl: "partials/register.html", controller: "PageCtrl"}) 
    .otherwise({redirectTo:"/home", template: "partials/home.html", controller: "PageCtrl"}); 
}]); 

/* 

CONTROLLERS 

*/ 

app.controller('PageCtrl', function($scope) { 

}); 

app.controller('NavCtrl', function($scope) { 
    var url = document.URL; 
    var array = url.split('/'); 
    var pathname = array[array.length-1]; 

    console.log("Pathname: "+pathname); 
    $scope.currentNavItem = pathname; 
}); 

app.controller('NutritionCtrl', function($scope) { 
    $scope.user = { 
    gender: 'Female', 
    goal: 'Lose Weight' 
    }; 

    $scope.genders = ('Male Female').split(' ').map(function(gender) { 
    return {abbrev: gender}; 
    }); 
    $scope.goals = ('Lose Weight_Gain Weight').split('_').map(function(goal) { 
    return {abbrev: goal}; 
    }); 
}); 

app.controller('PageCtrl', function($scope, $mdToast, $document) { 
    function showToast() { 
    $mdToast.show(
     $mdToast.simple() 
     .textContent('Simple lala Toast!') 
     .hideDelay(3000) 
    ); 
    }; 
}); 

/* 

METHODS 

*/ 

// FIREBASE CREATE USER METHOD 
function writeUserData(email, password) { 
    auth.createUserWithEmailAndPassword(email, password) 
    .then(function() { 

    }) 
    .catch(function(error) { 
    var errorCode = error.code; 
    var errorMessage = error.message; 

    if (errorCode == 'auth/weak-password') { 
     alert('The password is too weak.'); 
    } else { 
     alert(errorMessage); 
    } 
    console.log(error); 
    }); 
} 

// FIREBASE SIGN IN USER METHOD 
function signInUser(email, password) { 
    var email = document.getElementById('email-input').value; 
    var password = document.getElementById('password-input').value; 

    auth.signInWithEmailAndPassword(email, password).then(function(value) { 
    // REDIRECT TO THE HOME PAGE AFTER LOGIN 
    //window.location = "#/home"; 
    //location.reload(); 

    showToast(); 

    }).catch(function(error) { 
    var errorCode = error.code; 
    var errorMessage = error.message; 

    if (errorCode == 'auth/invalid-email') { 
     alert('That user does not exist.'); 
    } else { 
     alert(errorMessage); 
    } 
    console.log(error); 
    }); 
} 

// FIREBASE SIGN OUT USER METHID 
function signOutUser() { 
    auth.signOut().then(function() { 
    // REDIRECT TO THE HOME PAGE AFTER LOGOUT 
    window.location = "#/home"; 
    location.reload(); 
    }, function(error) { 
    // Errors go here. 
    }); 
} 

// FIREBASE AUTH STATE CHANGE METHOD 
auth.onAuthStateChanged(function(user) { 
    // NAVIGATION LINKS 
    var nutritionLink = document.getElementById('nav-nutrition'); 

    // USER INFORMATION 
    var user = firebase.auth().currentUser; 

    if (user) { 
    email = user.email; 
    uid = user.uid; 

    // HIDE/SHOW LINKS 
    $(nutritionLink).show(); 

    // UPDATE HEADER TEXT WITH USER EMAIL 
    document.getElementById('header-username').innerHTML="Logged in as " + email + " - <a href='#' onclick='return signOutUser(this);'>Sign Out</a>"; 

    console.log("Provider-specific UID: "+uid); 
    console.log("Email: "+email); 
    } else { 

    // HIDE/SHOW LINKS 
    $(nutritionLink).hide(); 

    // UPDATE HEADER TEXT WITH USER EMAIL 
    document.getElementById('header-username').innerHTML="<a href='#/login'>Login/Register</a>"; 
    } 
}); 

/* 

FUNCTIONS 

*/ 
+1

'signInUser()'はどこで宣言されていますか? 'PageCtrl'の中で定義されていなければ、アクセスできません。 – Sam

+1

あなたのsignToUser関数があなたのPageCtrlコントローラの中に存在していて(そしてアクセス可能なだけです)、あなたのsignInUser関数がないと仮定しています。 – Justin

+0

@Justinそうです。私はコントローラ内の機能がそのコントローラの外部からアクセスできないことを知りませんでした。どのようにそれを回避するためのアイデアですか?私はまた、投稿に私の完全なスクリプトを追加しました。ありがとう。 –

答えて

0

あなたはこのようにそれを行うことができます:

はJS

app.controller('PageCtrl', function($scope, $mdToast, $document) { 
    function showToast() { 
    $mdToast.show(
     $mdToast.simple() 
     .textContent('Simple lala Toast!') 
     .hideDelay(3000) 
    ); 
    }; 

    // FIREBASE SIGN IN USER METHOD 
    $scope.signInUser = function() { 
    var email = document.getElementById('email-input').value; 
    var password = document.getElementById('password-input').value; 

    auth.signInWithEmailAndPassword(email, password).then(function(value) { 
     // REDIRECT TO THE HOME PAGE AFTER LOGIN 
     //window.location = "#/home"; 
     //location.reload(); 

     showToast(); 

    }).catch(function(error) { 
     var errorCode = error.code; 
     var errorMessage = error.message; 

     if (errorCode == 'auth/invalid-email') { 
     alert('That user does not exist.'); 
     } else { 
     alert(errorMessage); 
     } 
     console.log(error); 
    }); 
    } 
}); 

あなたが関数内でそれらを取得しているとメールアドレスとパスワードを渡す必要はありませんマークアップ

<buttton ng-click="signInUser()">Sign In</button> 

編集:最良の方法でAngularJSを使用していないので、全体のアプローチを再考する必要があります。例えば、このような何かを:それはアクセスできるように

<input type="email" ng-model="email"> 

をして、コントローラの使用$scope.emailではなく

var email = document.getElementById('email-input').value; 
0

そもそも機能コントローラの範囲の上で

app.controller('PageCtrl', function($scope, $mdToast, $document) { 
    $scope.showToast = function() { 
     $mdToast.show(
      $mdToast.simple() 
      .textContent('Simple lala Toast!') 
      .hideDelay(3000) 
     ); 
    }; 
}); 

次に、あなたの 'signInUser()'関数で、次のコードを使用してコントローラを呼び出します。ここで、 '#pageCtrlID'はコントローラタグに与えられたIDです。

angular.element($('#pageCtrlID')).scope().showToast(); 

これはハックだと私は非常にあなたは時間があれば、より角度の設計(すなわちなしDOM操作)に従うためにあなたのページを構築するに見えることをお勧めします。

関連する問題