【问题标题】:angularJS $scope not being appliedangularJS $scope 没有被应用
【发布时间】:2015-04-13 18:01:27
【问题描述】:

我对 angularJS 很陌生,所以如果我说的完全错误,请原谅我。我正在聊天。我在获取数据后没有更新范围/视图的问题。我有一个变量 $scope.users ,它是一个包含用户信息的数组,视图对用户执行 ng-repeat 以显示他们的信息。 数据从前一页存储并通过会话存储加载。 控制器看起来像:

app.controller('table-controller',['$scope','$interval','HttpService','TableModel',
function($scope,$interval,HttpService,TableModel){
    var _this = this;
    console.log('loading table controller ...');


    $scope.users = [];
    var sessionData = JSON.parse(sessionStorage.getItem('sessionData'));
    var activeUsers = sessionData.activeUsers;

    //$scope.users = TableModel.initUsers();

    $scope.$watch('users',function(){
        for(var i = 0; i < 10; i++){
            $scope.users.push({
                user : ' ',
                name : 'Vacant',
                picture : '../img/sit_default.png',
                speak_turn : ' ',
                sit : i,
                last_request : 0
            });
        }
        for(var i = 0; i < activeUsers.length; i++){
            var sit  = activeUsers[i].sit;
            $scope.users[sit] = activeUsers[i];
        }   
    });
$scope.className = function(index){
        return "sit" + (index + 1);
    }

html 是:

 <ul class="first-place">
        <li ng-repeat="user in users track by $index" ng-class="className($index)">
          <div class="pro_pic_wrap">
            <img ng-src="{{user.picture}}" alt="">
            <span>{{$index + 1}}</span>
          </div>
          <a href="#">{{user.name}}</a>
        </li>  
 </ul>

如果我使用 $watch 创建 $scope.users,一切正常。否则,当页面加载时,视图会看到一个空的 $scope.users 所以 ng-repeat 什么都不做。如果我重新加载页面一切正常。我尝试了 $scope.$apply() 但给了我一个错误,说摘要已经被调用。我不明白为什么我需要在这里使用 $watch 。 在此先感谢您的帮助!

【问题讨论】:

  • 你为什么使用var users = sessionData.users;应该是$scope.users?
  • ya vanilla JS 对象“var users”不是要走的路。像 pankaj 说的那样保持在范围内。在那之后你不应该使用手表。
  • 我可能应该重命名我的变量。基本上每个页面最多可以有 10 个活跃用户。 var users 包含我在 $scope.users 中推送的活动用户以及空白空间
  • @alex436 好的..重命名并更新您的代码..

标签: angularjs scope apply watch


【解决方案1】:

你可以创建一个方法并调用它而不是使用 $watch

$scope.getUsers= function(){
    for(var i = 0; i < 10; i++){
            $scope.users.push({
                user : ' ',
                name : 'Vacant',
                picture : '../img/sit_default.png',
                speak_turn : ' ',
                sit : i,
                last_request : 0
            });
        }

        for(var x = 0; x < users.length; x++){
            var sit  = activeUsers[x].sit;
            $scope.users[sit] = activeUsers[x];
        }   
}
$scope.getUsers();

【讨论】:

  • 确保您已经在控制器中使用了“$sessionStorage”服务
  • 我不确定我是否理解。 sessionStorage 是一个 javascript 对象,可让您存储/检索会话相关数据w3schools.com/html/html5_webstorage.asp
  • 对不起,我以为你在使用 Angularjs ngStorage ngmodules.org/modules/ngStorage
  • 所以如果你用 $scope.sessionData $scope.activeUsers 替换 var sessionData var activeUsers ,这有意义吗?
  • 它也不起作用。我并不是真的在寻找一种摆脱手表的方法,而是要理解为什么在这种情况下,如果我不使用 $watch,$scope.users 将不会在视图中更新。感谢您的帮助想法
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2016-05-30
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多