2016-03-08 1 views
0

У меня есть этот код в моем app.js для отправки в чате и читать прямо в моем приложенииКак принимать последнее значение некоторого свойства из JSON в Angularjs

$scope.messageshistory = {}; 
$scope.tmp = {}; 

    // send message 
    $scope.sendMessage = function(){ 
     $scope.messages = { 
      from  : $scope.datauser['data']['_id'], 
      fromname : $scope.datauser['data']['nama'], 
      to  : $scope.tmpuserid, 
      message : $scope.tmp['sendmessage'], 
      time  : moment() 
     }; 
      //event emit message 
     socket.emit('message',$scope.messages,function(callback){  
      if(!callback['error']){ 
       $scope.messages['time'] = moment($scope.messages['time']).format('DD-MMMM-YYYY HH:MM'); 


       if ($scope.messageshistory.hasOwnProperty($scope.tmpuserid)){ //yg di json yg paling awal 
        $scope.messageshistory[$scope.tmpuserid].push($scope.messages); 
       }else{ 
        $scope.messageshistory[$scope.tmpuserid] = []; 
        $scope.messageshistory[$scope.tmpuserid].push($scope.messages); 
       } 
       $scope.tmp['sendmessage'] = ''; 
      }else{ 
       var msg = callback['error']; 
       navigator.notification.alert(msg,'','Error Report', 'Ok'); 
      } 

      $scope.$apply(); 
     }); 
    }; 
     //event read message 
    socket.on('message', function (data) { 

     window.plugin.notification.local.add({ 
      id  : moment(), 
      title  : data['fromname'], 
      message : data['message'].substr(0,20) + ' ...', 
      led  : 'A0FF05', 
      json  : JSON.stringify({ routes:'chat', nama :data['fromname'],from:data['from'] }) 
     }); 
     data['time'] = moment(data['time']).format('DD-MMMM-YYYY HH:MM'); 
     if ($scope.messageshistory.hasOwnProperty(data['from'])){ 
      $scope.messageshistory[data['from']].push(data); 
     }else{ 
      $scope.messageshistory[data['from']] = []; 
      $scope.messageshistory[data['from']].push(data); 
     } 

     for(var i = 0; i<= $scope.datauser['data']['friends'].length; i++){ 
      if($scope.datauser['data']['friends'][i]['userid'] == data['from']){ 
       $scope.datauser['data']['friends'][i]['ischat'] = true; 
       break; 
      } 
     }; 
     $scope.$apply(); 
    }); 

мой вопрос как взять последний значение в сообщении свойства от $scope.messageshistory, потому что $scope.messages для отправки сообщения, и $scope.messageshistory - сохранить историю чата. Это чат деятельность изображения:

enter image description here

только от этой деятельности, $scope.messageshistory сохранит в нем данные JSON, как:

{ 
    "5512": [{ 
     "from": "561c", 
     "fromname": "ryan", 
     "to": "5512", 
     "message": "hey", 
     "time": "18-Maret-2016 21:03" 
    }, { 
     "from": "5512", 
     "fromname": "sasa", 
     "to": "561c", 
     "message": "hello", 
     "time": "18-Maret-2016 21:03", 
     "_id": "593s" 
    }] 
} 

Я получаю это значение с помощью angular.toJson($scope.messageshistory), и этот массив будет всегда добавляйте, если действия чата все еще продолжаются. И мое намерение получить последнее значение в свойстве message от $scope.messageshistory - это использовать функцию Text-to-Speech в моем приложении. Код:

$scope.speakText = function() { 

    TTS.speak({ 
      text: **this the place for the code**, 
      locale: 'en-GB', 
      rate: 0.75 
     }, function() { 
      // handle the success case 
     }, function (reason) { 
      // Handle the error case 
     }); 
    }; 

будет высчитано Последнее сообщение в $scope.messageshistory. Итак, какой код я должен написать, чтобы взять последнее значение?

+0

выглядит как '$ scope.messageshistory' является объектом. Вы хотите получить последнее сообщение для определенного ключа userId? Или последнее сообщение, выпущенное сокетом? Как насчет '$ scope.messageshistory [$ scope.tmpuserid] [$ scope.messageshistory [$ scope.tmpuserid] .length-1]'? – cl3m

+0

@ cl3m wait Я попробую его –

+0

@ cl3m это работает, но его все еще свойство, как просто взять свойство «message» –

ответ

0

Вы должны сделать следующее:

var msgs = $scope.messageshistory[$scope.tmpuserid] 
var yourLastMessage = msgs[msgs.length-1].message 
// you could also add a quick check so you don't get 
// an error if the messages array is emtpy : 
// var yourLastMessage = (msgs && msgs[msgs.length-1] ? msgs[msgs.length-1].message : null) 

Редактировать

Некоторые пояснения на ваш комментарий:

var msgs = $scope.messageshistory[$scope.tmpuserid] 
// msgs is now an Array containing Objects 
// [{message : 'xxx'},{message : 'yyy'}] 
// we take the last entry of the msgs Array (msgs.length-1) 
// so msgs[msgs.length-1] is the last object ({message : 'yyy'}) 
// and finally we take the 'message' property' of that object: 
var yourLastMessage = msgs[msgs.length-1].message 
+0

его работа как шарм, спасибо за ваш ответ. Последний вопрос, поэтому лучше писать «var yourLastMessage = (msgs && msgs [msgs.length-1]? Msgs [msgs.length-1] .message: null)' или просто 'var yourLastMessage = msgs [msgs.length-1 ] .message'? –

+0

Поскольку вы всегда нажимаете значение в своем массиве ('$ scope.messageshistory [$ scope.tmpuserid] .push ($ scope.messages);'), вы можете разумно пропустить тест – cl3m

+0

можете ли вы взглянуть на мой предыдущий вопрос? http://stackoverflow.com/questions/35811385/how-do-make-hardware-back-button-become-exit-app, если вы не возражаете против этого. В этом вопросе я хочу, чтобы аппаратное обеспечение back button стало приложением для выхода, когда пользователь находится на странице «home».спасибо –

0

предполагая, что ключи в объекте истории восходящие номера и принимая во внимание, что порядок ключей в объекте не указан W3C, вы должны сделать следующее:

  1. получить все ключи
  2. найти «последнюю» (отсюда наибольшее количество)
  3. Пиль

так что вы могли бы сделать, например

var keys = Object.keys($scope.messagehistory); 
keys.sort (function (a, b) { 
    return a - b; 
}); 
var result = keys[keys.length - 1]; 
Смежные вопросы