Javascript DOM已更新,但其视图不是’;t渲染?
我正在尝试制作一个聊天应用程序。 我有一个函数,每当我得到一个新的msg,它就会运行,将msg添加到作用域中,这样它就会被ng repeat呈现。 函数如下所示:Javascript DOM已更新,但其视图不是’;t渲染?,javascript,angularjs,angularjs-ng-repeat,ionic-framework,Javascript,Angularjs,Angularjs Ng Repeat,Ionic Framework,我正在尝试制作一个聊天应用程序。 我有一个函数,每当我得到一个新的msg,它就会运行,将msg添加到作用域中,这样它就会被ng repeat呈现。 函数如下所示: var gotMsg = function(message) { var msg = message.message; var name = message.name console.log('scope.messages', $scope.msgCtrl.messages); $scope.msgCt
var gotMsg = function(message) {
var msg = message.message;
var name = message.name
console.log('scope.messages', $scope.msgCtrl.messages);
$scope.msgCtrl.messages[name].push({
message: msg,
user: name
});
$scope.$digest();
//scroll to bottom
$ionicScrollDelegate.scrollBottom(true);
我收到消息“没问题”,通过运行“ionic run android”并查看chrome inspect,我看到DOM更新为正确插入的新消息
然而!这些新消息没有正确呈现。它要么是白色的,要么是破碎的。当我向上滚动聊天记录,然后向下滚动时,它确实会显示出来。
这可能是什么原因造成的?我尝试过使用/不使用$digest/$apply/$timeout/$eval.Async等。到目前为止,没有任何效果。有什么想法吗
我找到了一种方法来正确呈现消息。 基本上需要隐藏和显示一个DOM元素,该元素将强制页面“移动”,以便重新呈现页面。 我发现元素必须引起移动,并且不能是隐藏元素。而且,它需要有一点延迟。0毫秒不起作用
$timeout(function() {
var el = document.getElementsByClassName("nbsp")[0];
el.style.display = 'none';
$timeout(function() {
el.style.display = 'block';
}, 50);
}, 50);
$scope.$digest()代码>仅为其子元素运行摘要循环..如果(!$scope.$$phase)$scope.$apply(),请尝试代码>我会试试看。。虽然我听说检查$$phase是否使用$apply不是一个好模式。嗯,我的问题不是绑定没有更新,当我使用chrome inspector检查时,它在DOM中是正确的。。为什么我的视图呈现如上所示?$scope.$apply()
必须检查$$phase
,其原因是,如果您直接运行apply,并且scope的阶段已经在运行摘要循环,那么它将破坏代码..并且错误将被抛出,因为$digest
已经按照角度运行$apply()
关于范围不是好的做法。无论何时,只要您不使用angular,比如使用任何jquery插件或任何其他javascript。或任何不带角度的异步操作。操作完成后,您有$apply()作用域。请参阅此文档$scope.$apply(函数(){console.log('scope.messages',$scope.msgCtrl.messages);$scope.msgCtrl.messages[name].push({message:msg,user:name});})代码>尝试此代码它应该可以工作。