2016-08-29 2 views
0

Я работаю в чате pubnub. И попытка направить новое сообщение на массив сообщений. У меня есть массив объектов почтовых сообщений, как.push не работает для angularjs и pubnub

Object {0: Object, 1: Object, 2: Object, 3: Object, 4: Object, 5: Object, 6: Object, 7: Object, 8: Object, 9: Object, 10: Object, 11: Object, 12: Object, 13: Object, 14: Object, 15: Object, 16: Object, 17: Object, 18: Object, 19: Object} 

Каждый объект содержит данные, такие как

Object {content: "asd", date: "2016-08-29T05:10:41.208Z", sender_username: "siehyvar", sender_uuid: "1294553"} 

теперь я пытаюсь нажать на другой объект

Object {content: "hi", sender_uuid: "1294553", sender_username: "siehyvar", date: "2016-08-29T05:47:40.232Z"} 

со следующим кодом

$scope.messages: []; 
scope.$on(API.getMessageEventNameFor(), function(ngEvent, m) { 
    scope.$apply(function() { 
     $scope.messages.push(m); 
    }); 
}); 

И ошибка я получаю

messages.push is not a function 

Я полагаю, сообщения здесь массив объектов, но функция .С не работает. Может ли кто-нибудь помочь?

Позвольте мне объяснить код. Поэтому у меня есть один чат Api, где я помещаю весь код pubnub, два контроллера (для интернет-пользователей и чат) и два шаблона хворостины (для интернет-пользователей и чат)

Сообщения декларации для текущего канала ChatApi:

current_channel: { 
    channel_name: null, 
    channel_label: null, 
    messages: [] 
}, 

Присоединяйтесь чат событие из chatApi

joinChat: function (chat_channel,scope) { 
     var channel = chat_channel.channel; 
     var channel_name = chat_channel.name; 
     //Join chatroom Channel with the room name 
     API.chatrooms.addMe(channel); 

     //Get online users in chatroom 
     API.chatrooms.onlineMembers(channel, scope); 
     //API.current_channel.channel_id = channel; 
     API.current_channel.channel_name = channel; 
     API.current_channel.channel_label = channel_name; 
     console.log(API.current_channel.channel_name); 
     API.getPresenceEventNameFor(); 

     // Listening to the callbacks for getting messages for current channel 
     scope.$on(API.getMessageEventNameFor(), function(ngEvent, m) { 
      scope.$apply(function() { 
       if (angular.isArray(scope.current_channel.messages)) { 
        scope.current_channel.messages.push(m); 
       }else { 
        console.log("Not is array"); 
       } 
      }); 
      scroller.down(500); 
     }); 

     API.getHistory(channel, scope); 

Twig для соединения чата с пользователем

<ul class="all-chats-list" ng-repeat="onlineUser in online.users"> 
<li class="col-xs-12 nopadding" ng-click="joinChat(onlineUser.chat_channel); selectMe($event);"> 

и сообщения показываются в виде

<li ng-repeat="message in current_channel.messages"> 

контроллера для соединения чата

$scope.joinChat = function(chat_channel) { 

    chatApi.joinChat(chat_channel, $scope); 
}; 

Теперь, когда я звоню отправить сообщение, как

Twig:

<form ng-submit="sendMessage()"> 
    <div class="col-xs-9 col-md-10 form-group nopadding"> 
     <input style="width: 100%" ng-model="message.content" class="form-control" type="text" placeholder="Type your message" /> 
    </div> 
    <div class="col-xs-3 col-md-2 form-group nopadding"> 
     <button type="submit" class="form-control btn site-btn" id="send-message">Send</button> 
    </div> 
</form> 

chatApi:

sendMessage: function() { 
     console.log('PUBLISH TO: ' + API.current_channel.channel_name); 
     // Don't send an empty message 
     if (!API.message.content || 
      API.message.content === '') { 
      return; 
     } 

     Pubnub.publish({ 
      channel: API.current_channel.channel_name, 
      message: { 
       content: API.message.content, 
       sender_uuid: models.user.uuid, 
       sender_username: models.user.username, 
       date: new Date() 
      }, 
      callback: function(m) { 
       //console.log(m) 
      } 
     }); 

     // Reset the messageContent input 
     API.message.content = ''; 

    }, 

Чат контроллер:

$scope.sendMessage = chatApi.sendMessage; 

Я получаю messages.push ошибок не является функцией. Я предполагаю, что это потому, что он рассматривает его как объект, а не массив.

Надеюсь, теперь это ясно.

+0

добавить свой HTML и функцию полного контроллера! – Aravind

+1

как fas, так как я понимаю '$ scope.messages' не является массивом, его объектом. можете ли вы рассказать нам, как вы определили '$ scope.messages'? –

+0

убедитесь, что $ scope.messages - это массив –

ответ

0

Замена линии

$scope.messages: []; 

по

$scope.messages = []; 

может устранить проблему.

1

Добавление к тому, что другие говорили,

Очевидный вопрос здесь: $scope.messages: [];

я набираюсь messages.push ошибка не является функцией.

Просто замените декларацию $ scope.messages с:

$scope.messages = [];

Теперь вы сможете вызвать метод push на $scope.messages массиве.

В вашем примере $ scope.messages был типа object (он должен был быть типа array).

Вы можете узнать больше о том, какие методы доступны для массивов и типов объектов в javascript here. Причина, по которой вы не можете позвонить, нажимаете на объект, а JS -

Если вы хотите взять липкую дорогу и НЕ определять массив, тогда я буду моим гостем и создадим метод прототипа push для типов объектов. Таким образом, вы можете вызвать push на объекты. Это будет действительно глупо, и вы столкнетесь с множеством проблем, например, при попытке использовать pop() или unshift() элементов вашего объекта (которые вы хотите обрабатывать как массив).

+0

Разве это не то, что сказал @lagrangemartin? –

+0

Разница заключалась в том, что @lagrangemartin не упоминал, почему он потерпит неудачу (нажатие не доступно по типу объекта). Но в интересах ОП я добавил некоторое объяснение, почему НЕ сделать это объектным путем. – SLearner

+0

Спасибо - имеет смысл. –