Одностороннее или одноразовое связывание в Angular и Watchers

0

У меня есть вопрос о том, как избежать наблюдателей, когда вы вводите текстовое поле только для чтения в AngularJS.

Я создал для него plunker link: OneWay Binding using ng-value

Это показывает, что даже когда я использую ng-значение для ввода текста только для чтения, для него по-прежнему добавляется наблюдатель.

Я просто хочу избежать наблюдателей, когда есть элементы управления только для чтения, я спрашиваю об этом, потому что в моем корпоративном приложении, даже для страницы только для чтения, у меня более 200 элементов управления только для чтения, и число наблюдателей приближается к 1100, что замедляет мое Angular Application.

  • 0
    возможно попробуйте это: docs.angularjs.org/api/ng/directive/ngReadonly, просто выполнив ng-readonly=true чтобы увидеть, добавлен ли наблюдатель для значения.
  • 0
    Спасибо, но не повезло, поскольку ng-readonly = true не уменьшает количество наблюдателей.
Показать ещё 2 комментария
Теги:
performance
angular-ngmodel
angularjs-ng-value

1 ответ

0

Найден способ сделать это с помощью односторонних привязок:

var app = angular.module('app', []);

app.controller('MainCtrl', function($scope) {
  
//$scope.watcherCount = 0;
$scope.countWatchers = function () {
    var root = angular.element(document).injector().get('$rootScope');
    var count = root.$$watchers ? root.$$watchers.length : 0; // include the current scope
    var pendingChildHeads = [root.$$childHead];
    var currentScope;
    
    while (pendingChildHeads.length) {
        currentScope = pendingChildHeads.shift();

        while (currentScope) {
            count += currentScope.$$watchers ? currentScope.$$watchers.length : 0;
            pendingChildHeads.push(currentScope.$$childHead);
            currentScope = currentScope.$$nextSibling;
        }
    }

    $scope.watcherCount = count;
    
    // alert("there are " + count  + " watchers");
    return count;
  }
});
<!DOCTYPE html>
<html ng-app="app">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular.min.js"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <input type="text" ng-model="a">
    <input type="text" value="{{::a}}" ng-readonly=true></input>
    <button ng-click="countWatchers()">Get Watchers</button>
    <br>
    Watcher Count <!--table><tr></tab><td bo-text="watcherCount"></td></tr></table-->
    <span>{{watcherCount}}</span>
    
  </body>

</html>

Попробуйте нажать "Получить наблюдателей" и убедитесь, что количество наблюдателей изначально 3. Затем напишите что-нибудь или скопируйте/вставьте в первый вход и снова нажмите "Получить наблюдателей". Voila количество наблюдателей уменьшилось до 2, потому что однократная привязка ко второму входу получила оценку, когда она получила значение, а затем удалила наблюдателя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню