TypeError:$ scope.messages.push不是函数

时间:2017-02-18 02:10:39

标签: javascript firebase ionic-framework firebase-realtime-database messaging

我正在使用Firebase在我的Ionic应用程序中进行聊天集成,并尝试显示以下消息:

  1. 已发送
  2. 来自上一次
  3. 到目前为止,我可以很好地检索以前显示的消息,或者提交新消息没有问题。

    HOWEVER 我无法找到同时执行 BOTH 功能的方法。

    如果我使用以下代码,则会出现此错误:

    TypeError: $scope.messages.push is not a function
    

    有什么想法吗?

    以下是我的控制器代码:

    .controller('Messages',['$scope', '$ionicScrollDelegate', '$timeout', '$firebaseArray', 'CONFIG', '$document', '$state', function($scope,  $ionicScrollDelegate, $timeout, $firebaseArray, CONFIG, $document, $state) {
      $scope.hideTime = false;
      var myId = firebase.auth().currentUser.uid;
      var otherId = "0LhBcBkECAXn6v12lA2rlPIsQNs2";
      var discussion = myId + otherId;
    
      var isIOS = ionic.Platform.isWebView() && ionic.Platform.isIOS();
    
      //Recieve messages
      var ref = firebase.database().ref('/messages/' + discussion);
      ref.orderByChild("timestamp").on("value", function(snapshot1) {
        console.log(snapshot1.val() + "HEY");
        $scope.messages = snapshot1.val();
    
      })
    
      //Send messages
      $timeout(function(){
        $scope.sendMessage = function() {
    
          var d = new Date();
          var g = new Date();
          d = d.toLocaleTimeString().replace(/:\d+ /, ' ');
          g = g.toLocaleTimeString().replace(/:\d+ /, ' ') + new Date();
    
    
    
          $scope.messages.push({
            userId: myId,
            text: $scope.data.message,
            time: d
          });
    
          $scope.sendMessages = firebase.database().ref('/messages/' + discussion).push({
            userId: myId,
            text: $scope.data.message,
            time: d,
            timestamp: g
          });
    
          console.log($scope.messages);
    
          delete $scope.data.message;
          $ionicScrollDelegate.scrollBottom(true);
    
        };
    
        $scope.inputUp = function() {
          if (isIOS) $scope.data.keyboardHeight = 216;
          $timeout(function() {
            $ionicScrollDelegate.scrollBottom(true);
          }, 300);
    
        };
    
        $scope.inputDown = function() {
          if (isIOS) $scope.data.keyboardHeight = 0;
          $ionicScrollDelegate.resize();
        };
    
        $scope.closeKeyboard = function() {
          // cordova.plugins.Keyboard.close();
        };
        $scope.data = {};
        $scope.myId = myId;
        $scope.messages = [];
    
    
    
      })
    
    }]);
    

    以下是 HTML 的代码:

    <ion-view view-title="Chat Detail">
    <ion-content class="padding" start-y="430">
        <!-- *messages / content messages -->
        <ol  class="messages">
            <!-- *self / container self messages -->
            <li ng-repeat="message in messages" ng-class="{other: message.userId != myId}" class="self">
                <!-- *avatar / avatar image -->
                <div class="avatar">
                    <img src="img/82.jpg">
                </div>
                <!-- *msg / messages -->
                <div class="msg">
                    <p>{{ message.text }}</p>
                    <time>
                        <i class="icon ion-ios-clock-outline"></i>
                        {{message.time}}
                    </time>
                </div>
            </li>
        </ol>
    </ion-content>
    <!-- *bar-detail / color bar and input -->
    <ion-footer-bar keyboard-attach class="item-input-inset bar-detail">
        <label class="item-input-wrapper">
        <input type="text" placeholder="Type your message" on-return="sendMessage(); closeKeyboard()" ng-model="data.message" on-focus="inputUp()" on-blur="inputDown()" />
        </label>
        <a class="button button-icon icon ion-arrow-return-left" ng-click="sendMessage()" ></a>
    </ion-footer-bar>
    

    提前感谢您的建议和意见!

1 个答案:

答案 0 :(得分:0)

解决方案在19小时后发现,太荒谬了:

我不得不摆脱代码的那一部分。

$scope.messages.push({
        userId: myId,
        text: $scope.data.message,
        time: d
      });

并确保检索邮件的值位于“ on ”而不是“一次”,以便与Firebase的实时数据库一起使用。