角度更新绑定

时间:2017-03-20 22:23:51

标签: angularjs

我试图弄清楚如何应用$ digest()或$ apply()来更新绑定。

我已经在其他线程上做了一些阅读,我认为这个概念是有道理的。但是,我无法将其应用于我的特定背景。这可能意味着我迄今为止的做法存在缺陷......

以下是我的情况:

  • 我有两个下拉菜单:学校和老师
  • 加载页面时,学校下拉列表将根据服务返回的数据进行填充
  • 当您选择学校时,教师服务将触发并返回教师列表
  • 很遗憾,教师下拉列表中没有新的教师名单
  • 如果我点击另一个路由页面,然后点击返回,则可以使用新的教师列表

这是我的MainController:

app.controller('MainController', function ($scope, $timeout, schoolService, teachersService) {
var self = this;
self.teachers = teachersService.teachers;

self.schoolSelected = function () {

            setTimeout(function () {
                    teachersService.goGetTeachers($scope.sessionKey);
                    console.log(self.teachers);
                    $scope.$apply();
            }, 5);   
};
}

当触发schoolSelected时,它会执行teachersService。返回的数据记录到控制台。我没有收到任何错误。

但是,它不会更新self.teachers。当console.log(self.teacher)在schoolSelected函数中运行时,它返回" undefined。"

我认为这是同步性问题,并且在服务完成之前,console.log(self.teacher)和$ scope。$ apply()都在运行。

1 个答案:

答案 0 :(得分:0)

除非数据绑定到$ rootScope,否则AngularJS不会将控制器范围数据保留在多个路由中。在您的情况下,您可以使用服务并在所有路径中保留数据。请查看以下代码以获得理解

<div ng-app="myApp">
    <div ng-controller="myCtrl">
        Value of foo property : {{data.foo}}
    </div>
    <div ng-view></div>
</div>

angular.module('myApp', ['ngRoute']).config(function ($routeProvider) {
    $routeProvider.when('/', {
        template: '<h1>Data</h1><a href="#/data">Data View</a>',
    })
    .when('/data', {
        template: '<h2>Data</h2><input type="text" ng-model="data.foo" />' +
                   '<br /><a href="#/">Back</a>',
        controller: 'dataCtrl'
    })
    .otherwise({
        redirectTo: '/'
    });
 }).factory('mySharedData', function() {    
       return {
         shareData: {
                 foo: 'foo',
                 bar: 'bar'
         }
     }
 }).controller('myCtrl', ['$scope', 'mySharedData', function($scope, mySharedData) {    
      $scope.data = mySharedData.shareData;
    }
]);