【问题标题】:Angular data does not show on loading加载时不显示角度数据
【发布时间】:2015-10-06 07:41:32
【问题描述】:

加载时未显示的 ng-binding 使用范围内数组中的数据。

该数组从另一个数组(我们称它们为 A)中获取数据。

加载时已经显示的 ng-binding 使用来自数组 A 的数据。

以下是显示真正奇怪的数据的几种方法:
- 聚焦然后不聚焦任何输入
- 更改任何输入的值

你可以试试here这个bug。

这里我提供了一些我的代码:

      <div class="container-fluid " id="mainApp"> 

                <div class="container" ng-repeat='content in fetchedData'>

                  <h4>{{content[1]}}</h4>

                  <div class="row" ng-repeat='data in content[2]'>
                  <p class="pull-left">{{data[0]}}<p>
                  <input data-toggle='tooltip' title ='{{data[1]}} hours per page'  ng-model='data[2]' type='number' min=0 class='form-control numberInput pull-right'>
                  </div>

                </div>

                   <div class="container">

                    <h4>{{languageData[0]}}</h4>

                    <div class="row" >
                    <p class="pull-left">{{languageData[1][0][0]}}<p>
                    <input data-toggle='tooltip' title ='{{languageData[1][0][1]}} hours per page'  ng-model='languageData[1][0][2]' type='number' min=0 class='form-control numberInput pull-right'>
                    </div>

                  </div>
      </div>

获取languageData的js代码文件:

$scope.getLangData = function (){
            var langData = [];
            var langPanel = Parse.Object.extend("Panel");

            var langpanelObject = new Parse.Query(langPanel);

            langpanelObject.equalTo('editable',false);
            langpanelObject.find( {
                success:function(results) 
                {
                    for (var i = 0; i < results.length; i++) {
                             langData.push(results[i].get("title"),[],results[i].id);
                    };

                    for (var i = 0; i < $scope.fetchedRows.length; i++) {
                        if ($scope.fetchedRows[i][3]== langData[2]) {
                            langData[1].push($scope.fetchedRows[i]);
                        }
                    };
                },
                error:function(error) 
                {
                    alert("Error: "+ error.code + " " +error.message);
                }
            });
            $scope.languageData = langData;
            $scope.$apply();
}

我猜是 js 代码导致了这个错误,因为我有一个按钮,点击时触发 getLangData() 函数(即站点中的Reset 按钮),数据再次消失。但是,我不知道它如何以及为什么会影响 ng-binding 的可见性。

【问题讨论】:

  • 为什么$scope.$apply(); 在控制台中抛出错误。您无需使用$scope.$apply();',因为范围会在控制器中自动消化
  • 我使用它是因为 ng 绑定到 html 是在获取数据之前加载的。因此,在可以显示数据之后,我认为我应该使用 $apply 以便更新绑定。你有什么错误?我没有来自控制台的错误。我试图在代码中删除 apply 但问题仍然存在。

标签: javascript jquery arrays angularjs parse-platform


【解决方案1】:

$scope.$apply() 在您的异步调用解决之前正在运行。

由于 Parse 库不在 Angular 线程中,您必须在范围内运行 $apply,但正确的方法是:

langpanelObject.find( {
    success: function(results) {
        for (var i = 0; i < results.length; i++) {
            langData.push(results[i].get("title"),[],results[i].id);
        };

        for (var i = 0; i < $scope.fetchedRows.length; i++) {
            if ($scope.fetchedRows[i][3]== langData[2]) {
                langData[1].push($scope.fetchedRows[i]);
            }
        };

        $scope.$apply(function () {
            $scope.languageData = langData;
        });
    },
    error: function(error) {
        alert("Error: "+ error.code + " " +error.message);
    }
});

最好使用$apply 将函数作为参数传递,而不仅仅是$scope.$apply()

【讨论】:

  • 感谢您的回答。是$scope.$apply(...) 还是只有$scope.apply()
  • 我是$scope.$apply(...),抱歉,打错了,我会改正答案的。
【解决方案2】:

问题是因为 Javascript 在我的 languageData 更新之前执行了 scope.$apply() 。 解决方法是通过 setTimeOut() 延迟 $apply() 函数。

setTimeout(function(){ $scope.$apply();}, 500);

【讨论】:

  • 无故延迟一些代码不是一个好习惯。请看我的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多