Как динамически обновить переменную области видимости AngularJS $? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть проект, в котором я отображаю список записей для моей HTML-страницы, например, этот пример, из которого я взял:

https://www.w3schools.com/angular/ng_ng-repeat.asp

<body ng-app="myApp" ng-controller="myCtrl">

<h1 ng-repeat="x in records">{{x}}</h1>

<script>
var app = angular.module("myApp", []);
app.controller("myCtrl", function($scope) {
    $scope.records = [
        "Alfreds Futterkiste",
        "Berglunds snabbköp",
        "Centro comercial Moctezuma",
        "Ernst Handel",
    ]
});
</script>

</body>

Теперь все это прекрасно работает, когда $scope.records определен статически.Но моя проблема в том, что мне нужно получить свои записи из REST API, который вызывается из моего сервиса, например:

<script>
var app = angular.module("myApp", []);
app.controller("myCtrl", function($scope, myService) {
    myService.getRecords(function(records) {
        $scope.records = records.data;  // An array of records
    });
});
</script>

Очевидно, что когда я вызываю myService.getRecords(...), я передаю ему анонимную функциюкак обратный вызов, который выполняется asyc отложенным образом.

Я регистрирую результаты records, поэтому я знаю, что мой вызов работает, и мои данные хороши и корректны.Но похоже, что $scope.records не знает, что оно было только что обновлено.


Обновление: 2018.10.10 - Найдено!Искал это, но нигде не мог найти ответ.Вскоре после публикации вопроса я нашел его в двух местах.

Я опубликую ссылки здесь в качестве ответа для тех, кто ищет такое же решение.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Единственная причина, по которой вам нужно $scope.$apply, заключается в том, что вы используете angularjs неправильно.И в вашем приложении использование jQuery для выполнения вызовов API является неправильным способом выполнения angularjs.

Вместо использования jQuery используйте службу angularjs $ http .Служба позаботится о синхронизации с областью angularjs, и вы не будете вынуждены вручную использовать $scope.$apply().Служба включена в платформу, поэтому единственное, что вам нужно сделать, это внедрить ее в вашу службу

Вот пример:

var app = angular.module("myApp", []);
app.controller("myCtrl", function($scope, myService) {
    myService.getRecords().success(function(records) {
        $scope.records = records.data;  // An array of records
    });
});
app.factory('myService', function($http){
    return {
        getRecords: function() {
            return $http.get('yourapi/records');
        }
    };
});
0 голосов
/ 11 октября 2018

Искал, но нигде не мог найти ответ.Вскоре после публикации вопроса я нашел его в двух местах.

Я опубликую ссылки здесь в качестве ответа для всех, кто ищет такое же решение.

Ответ - $scope.$apply()

Отличная статья здесь:

http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

И у кого-то был похожий вопрос по SO здесь:

Как я могу сказать AngularJS"refresh"

Просто не уверен, почему я не увидел этот вопрос и ответы в списке при вводе вашего вопроса.Но независимо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...