6

Tôi mới đến angularjs. Tôi gặp sự cố khi truy cập giá trị được trả về từ dịch vụ angularjs trong bộ điều khiển. Tiếp theo là các mã trong bộ điều khiển:Làm thế nào để bộ điều khiển chờ dịch vụ trả về một giá trị và cách truy cập giá trị trả về trong bộ điều khiển?

'use strict'; 
app.controller('AdminTaskCtrl', function ($scope, Search) { 
    $scope.buildEnquiry = function (collegeId,) { 
     Search.getIdByEmail(collegeId).then (function (result) { 
      $scope.uId = result; 
      console.log($scope.uId); 
     }); 
    }; 
});//controller ends here 

Và mã trong dịch vụ tìm kiếm là như sau:

'use strict'; 
      app.factory('Search',function ($firebase, FIREBASE_URL, $rootScope) { 
          var simpleuser = ""; 
          getIdByEmail: function(counsellorEmail) { 
          var collegeuserArray = ($firebase(new Firebase(FIREBASE_URL+"abc/def/")).$asArray()); 
          collegeuserArray.$loaded(function(collegeuserArray) { 
           for(var i=0; i<collegeuserArray.length; i++) 
           { 
           if((collegeuserArray[i].$value) == counsellorEmail) 
           { 
            simpleuser = collegeuserArray.$keyAt(collegeuserArray[i]); 
            console.log(simpleuser); 
            return simpleuser; 
           } 
           } 
          }, function(error) { 
           console.error("Error:", error); 
          }); 
        } 
        };  
      );//service ends here. 

Khi mã thực thi nó mang lại cho lỗi cho .Sau đó chức năng như Fallows :

LoạiError: undefined không phải là hàm và giá trị trong bộ điều khiển không được truy cập.

Vui lòng trợ giúp.

+0

bạn phải thực hiện ' '$ q'' vào nhà máy, hãy kiểm tra này: https://docs.angularjs.org/api/ng/service/$q –

+0

Hey Deblaton Jean-Philippe, Tôi gặp rắc rối khi triển khai $ q trong nhà máy của tôi. Bạn có thể hướng dẫn tôi qua quá trình ... !! ? –

+0

$ firebase là gì và tại sao bạn trả lại lần đầu tiên? Đôi khi bạn có nhập vòng lặp "for" của mình không? –

Trả lời

4
'use strict'; 
     app.factory('Search',function ($firebase, FIREBASE_URL, $rootScope, $q) { 
         var simpleuser = ""; 
         getIdByEmail: function(counsellorEmail) { 
         var deferred = $q.defer(); 
         var collegeUserArray = ($firebase(new Firebase(FIREBASE_URL+"abc/def/")).$asArray()); 
         collegeUserArray.$loaded(function(collegeUserArray) { 
          for(var i=0; i<collegeUserArray.length; i++) 
          { 
          if((collegeUserArray[i].$value) == counsellorEmail) 
          { 
           simpleUser = collegeUserArray.$keyAt(collegeUserArray[i]); 
           console.log(simpleUser); 
           //return simpleUser; 
           deferred.resolve(simpleUser); 
          } 
          } 
         }, function(error) { 
          console.error("Error:", error); 
          deferred.reject(error); 
         }); 
         return deferred.promise; 
       } 
       };  
     ); 

Và điều khiển của bạn

'use strict'; 
app.controller('AdminTaskCtrl', function ($scope, Search) { 
    $scope.buildEnquiry = function (collegeId,) { 
    Search.getIdByEmail(collegeId).then (function (result) { 
     $scope.uId = result; 
     console.log($scope.uId); 
    }, function(error){ 
     //If an error happened, handle it here 
    }); 
    }; 
}); 
+0

Cảm ơn Deblaton Jean-Philippe. Mã làm việc cho tôi. –

+0

Cú pháp ở đây cũng có vẻ không hợp lệ, được sao chép từ câu hỏi gốc. Ngoài ra, $ loaded đã trả về một lời hứa. – Kato

1

Để trực tiếp trả lời câu hỏi của bạn, $loadedreturns a promise, vì vậy câu trả lời đơn giản nhất ở đây sẽ được trả lại từ dịch vụ của bạn thay vì làm phiền với $ q và tất cả những thứ khác .

Có vẻ như toàn bộ tiền đề ở đây là thiếu sót và rằng đây là XY problem. Nó có vẻ như một số hacks có ý định phá hoại mục đích sử dụng của các libs, và giống như một đọc tốt, vững chắc của Angular walkthroughAngularFire guide sẽ tiết kiệm rất nhiều đau và phức tạp không cần thiết ở đây.

Việc sử dụng nhà máy ở đây là một phiên bản lật đổ và kết hợp chặt chẽ. Cú pháp không hợp lệ và sẽ không biên dịch. Và cuối cùng, mục tiêu là thêm một phương thức tìm kiếm vào mảng được đồng bộ được trả về từ AngularFire, nên được thực hiện với $ extendFactory.

app.factory('firebaseRef', function(FIREBASE_URL) { 
    return function(path) { 
     var ref = new Firebase(FIREBASE_URL); 
     if(path) { ref = ref.child(path); } 
     return ref; 
    } 
}); 

app.factory('SearchableArray', function($firebase, $FirebaseArray) { 
    var ArrayWithSearch = $FirebaseArray.$extendFactory({ 
    searchByEmail: function(emailAddress) { 
     var res = null; 
     for(var i=0, len=this.$list.length; i < len; i++) { 
      if(this.$list[i].email === emailAddress) { 
       res = this.$list[i]; 
       break; 
      } 
     } 
     return res; 
    } 
    }); 

    return function(ref) { 
     return $firebase(ref, {arrayFactory: ArrayWithSearch}).$asArray();  
    } 
}); 

app.controller('Controller', function($scope, SearchableArray, firebaseRef) { 
    $scope.data = SearchableArray(firebaseRef('abc/def')); 

    $scope.search = function(email) { 
     console.log($scope.data.searchByEmail(email)); 
    }; 
}); 
Các vấn đề liên quan