AngularJS OneTime Binding с ng-repeat не ми позволява да опреснявам обхвата

Имам списък, който използвам ng-repeat и еднократно обвързване, защото няма нужда да актуализирам, след като имам данните.

Надявах се, че мога да използвам еднократно обвързване и принудително обобщаване, но получавам често срещаната грешка, че $digest is already being processed или каквото и да е.

Моят код изглежда по следния начин

$scope.$on(IonicEvents.beforeEnter, function() {
    Locations.getAllLocations()
        .then(function(allLocations) {
            $scope.model.locations = allLocations;
            //I have tried $scope.$digest()..
            //also $scope.$apply()...
        }, function(error) {
            $log.error('Error retrieving locations');
        })
});

Моят ng-repeat в моя шаблон изглежда по следния начин:

<ion-item class="item" ng-repeat="location in ::model.locations">
    <div class="row">
        <div class="col">
            <p>{{::location.name}}</p>
        </div>
    </div>
</ion-item>

Някакви идеи или съм напълно извън пистата?


person TheJediCowboy    schedule 24.03.2016    source източник


Отговори (2)


Мисля, че първо можете да проверите if(!$scope.$$phase), след което да приложите своя процес

$scope.$on(IonicEvents.beforeEnter, function() {
if(!$scope.$$phase) {
    Locations.getAllLocations()
        .then(function(allLocations) {
            $scope.model.locations = allLocations;
            //I have tried $scope.$digest()..
            //also $scope.$apply()...

        }, function(error) {
            $log.error('Error retrieving locations');
        })
   }
});
person Nadimul De Cj    schedule 24.03.2016
comment
няма нужда да проверявате за $scope.$$phase. Само за вътрешна употреба на angularjs. И няма да се поддържа в бъдеще. - person Ranjith Kumar; 24.03.2016
comment
искаш да кажеш, че новата версия пропуска тази стъпка?? - person Nadimul De Cj; 24.03.2016
comment
Моля, проверете тази връзка. връзка - person Ranjith Kumar; 24.03.2016
comment
виждате тук също споменат същия проблем ... $digest вече се обработва - person Nadimul De Cj; 24.03.2016

Да, мисля, че се отклонихте.

Моята идея за вашата конкретна ситуация би била да използвам обект-клонинг (без препратка към основния обект), след като бъдат извлечени от Locations.getAllLocations() с помощта на

$scope.clonedLocationObj = angular.copy($scope.model.locations);

и изобразете този обект на вашия изглед, така че да не повлияе на основния ви обект.

Що се отнася до еднопосочното обвързване, Angular не ви позволява отново да промените еднократно обвързания модел, защото когато декларираме стойност като {{ ::foo }} вътре в DOM, след като тази foo стойност стане дефинирана, Angular ще изобразете го, развържете го от наблюдателите и по този начин намалете обема на свързванията вътре в цикъла $digest. просто! статия за синтаксиса за еднократно обвързване на Angular

Дано помогне.

person M. Junaid Salaat    schedule 24.03.2016