Javascript AngularJS-当模型变大时,调用$apply()会影响性能吗?

Javascript AngularJS-当模型变大时,调用$apply()会影响性能吗?,javascript,angularjs,Javascript,Angularjs,我对AngularJS很陌生,我真的很喜欢。我现在正在做一个聊天应用程序。每次客户端收到朋友的消息时,模型都会在没有通知的情况下更改,因此我需要调用$apply() 我只是对模型中存在的10k条消息做了一个快速测试,每次有新消息出现,$apply需要1秒来完成它的脏检查 所以,我的问题是:angular真的适合这种类型的应用吗?我在监控远程终端时遇到了同样的问题。您真的需要在模型中存储消息吗?通过在DOM中使用指令存储消息,转换可能对您有用吗 HTML: 添加消息 文本1 文本2 文本3

我对AngularJS很陌生,我真的很喜欢。我现在正在做一个聊天应用程序。每次客户端收到朋友的消息时,模型都会在没有通知的情况下更改,因此我需要调用$apply()

我只是对模型中存在的10k条消息做了一个快速测试,每次有新消息出现,$apply需要1秒来完成它的脏检查


所以,我的问题是:angular真的适合这种类型的应用吗?

我在监控远程终端时遇到了同样的问题。您真的需要在模型中存储消息吗?通过在DOM中使用指令存储消息,转换可能对您有用吗

HTML:


添加消息
文本1
文本2
文本3
JS:

angular.module(“main”,[])
.controller(“MyCtrl”,函数($scope){
$scope.test='testmessage';
})
.directive(“ngMessage”,函数($compile){
返回{
模板:“标题
”, 限制:'E', 是的, 链接:功能(范围,elm){ scope.add=函数(文本){ elm.之后($compile(“”+text+“”)(范围)); } } }; });
如果您需要在模型中显示10K消息,我会说Angular不适合您的应用程序,至少在
Object.observe()可用之前是这样@joakimbl我对前端的MVC框架非常陌生,你认为emberjs/backbone是否适合拥有大量消息的聊天室的聊天应用程序?如果你真的想在聊天客户端中显示10k消息,你宁愿遇到可用性问题,而不是框架问题。也许您不想显示所有这些10k消息,但要删除旧消息。那么多的消息对您的用户来说是个问题,而不是对您正在使用的框架来说。@Tharabas:好吧,这不是一个好例子,我只是好奇MVC框架如何查看和模型绑定,以及如何处理模型变得非常大的情况。例如:当添加一条消息时,Angular采用的方法是检查整个模型的变化,因此当模型增长时,它会变得慢得多。如果我们使用setter和geter,它们可能知道添加的消息是唯一的更改,那么我们可以相应地更新视图,而无需再次检查模型。我不确定Emberjs或任何MVC框架是否能做到这一点,所以我要问:PMisko(Angular.js的创建者)曾经说过:“如果你在一个页面上有1000个绑定,那你就真的做错了。”。主干不会对其集合进行脏检查,它使用事件,因此对集合的添加可以更快,但它在另一个用例中存在缺陷。只是不要在模型中创建10000个项目。你的用户会感谢你的。
<div id="container">
    <button ng-click="add(test)">Add message</button>
    <ng-message>Text 1</ng-message>
    <ng-message>Text 2</ng-message>
    <ng-message>Text 3</ng-message>
</div>
angular.module("main", [])
.controller("MyCtrl", function($scope) {
    $scope.test = 'Test Message';
})
.directive("ngMessage", function ($compile) {
    return {
        template: '<div ng-transclude><b>Heading <br></b></div>',
        restrict: 'E',
        transclude: true,
        link: function (scope, elm) {
            scope.add = function(text){
               elm.after($compile('<ng-message>' + text + '</ng-message>')(scope));
            }
        }
    };
});