Angular 在视图中看不到我的数组更改

Angular can't see my Array change in the view

我将 angularjs 与 Node-webkit 一起使用,并使用 nedb(作为嵌入式数据库)制作桌面应用程序。

我的问题是,当我(通过服务)从数据库加载对象列表并尝试在视图中显示它们(使用 ng-repeat)时,视图看不到加载的数据(看起来像它没有得到任何更新)

当我放置静态数据时:

$scope.levels  = [{_id:'abcd'},{_id:'efgh'}];

视图得到它没有任何问题。

我做了一些研究,看起来这与 $apply 有关 $digest...我不确定。

这是我的代码:

    //router
    .state('level', {
    url: '/level',
   templateUrl:'frontend/components/level/views/level.html',
                                                                         controller: 'LevelController'

                    })

控制器从数据库异步加载数据:

levelModule.controller('LevelController', function($scope,$rootScope,LevelService) {

//  $scope.levels  = [{_id:'abcd'},{_id:'eff'}];
  $scope.levels  = [];

  LevelService.getAllLevels(function(lvs) {
    console.log("tous "+JSON.stringify(lvs));
    $scope.levels = lvs;
  });

这是我的服务:

levelModule.factory('LevelService', function(DB_URL) {
    var Datastore = require('nedb')
    , path = require('path');
    db = {};
    db.levels = new Datastore({ filename:DB_URL+'/levels.db',autoload: true });


            return  {

                    getAllLevels : function(callback) {
                                            db.levels.find({}, function (err, lvs) {
                                                if(err)
                                                            console.log(err);
                                                        else

                                                            callback(lvs);


                                            });
                    },

                    insertLevel: function(level,callback) {
                        db.levels.insert(level, function (err, lv) {
                            if(err)
                                        console.log(err);
                                    else
                            callback(lv);
                        });
                    },
                    upsertLevel: function(level,callback) {

                        db.levels.update({_id: level._id}, {_id: level._id,price: {t1:{},t2:{},t3:{}}}, { upsert: true }, function(err,numReplaced,lv){
                                if(err)
                                        console.log(err);
                                    else
                            callback(numReplaced,lv);
                        });

           }
        };

});

最后是我的观点:

<table  class="table table-bordered table-hover">
     <tr ng-repeat="level in levels">
         <td>
           {{level._id}}
          </td>

         <td>
             <button ng-click="loadPrices(level)" type="button" class="btn btn-default" data-animation="am-fade-and-scale" data-template="frontend/components/level/views/level.edit.html" data-placement="center" bs-modal="modal">
                 <i class="fa fa-pencil-square-o"></i> Modifier
             </button>
         </td>
     </tr>
</table>

有什么帮助吗?

通过将 $apply() 放在异步函数中解决:

 LevelService.getAllLevels(function(lvs) {

    $scope.levels = lvs;
    $scope.$apply();
  });

您使用的是旧式回调,它发生在 Angular 摘要之外。很高兴您通过调用 $apply 让它工作,但您应该尝试将您的服务修改为 return a Promise。 Promises 是执行异步操作的 Angular 方式。

您可以在 https://thinkster.io/a-better-way-to-learn-angularjs/promises and https://docs.angularjs.org/api/ng/service/$q 阅读更多关于它们的信息。