使用不触发模型更改的服务使用 $http 更新模型

Update model with $http using a service not triggering model change

我有以下型号:

 var MODEL = { myTable: [], anotherTable: [] }; //--- initially set as empty arrays

MODEL 是一个全局变量,用于绑定不同控制器中的应用程序模型。

我开发了一个更新模型的服务,从 php 页面获取数据 returns table 行:

myApp.factory('myAppUtils', function($http) {
     return {
            updateModelTable: function(tableName) {
                var pageToCall = "";
                var params = "";
                switch(tableName){
                    case 'myTable':
                        pageToCall = "myTable.php";
                        params = "";
                        break;
                    case 'anotherTable':
                        break;
                    default:
                        break;
                }

                var updateModel = function(tableName, data){
                    MODEL[tableName] = data;
                };

                var url = "/" + pageToCall;
                $http.get(url).
                    success(function(data, status, headers, config) {
                        updateModel(tableName, data);
                    }).
                    error(function(data, status, headers, config) {
                        alert("error");
                    });
            }
        };
});

然后是控制器之一:

myApp.controller("MyTableCtrl", function($scope, myAppUtils){
    $scope.table = MODEL.myTable;
    myAppUtils.updateModelTable("playersTable");
});

一旦我 运行 应用程序正确调用了 myAppUtils.updateModelTable() 函数,它确实成功更新了 MODELMyTableCtrl 控制的视图不会相应更新.

我想做的是设置某种 CRUD 操作,从 sql 数据库获取和设置值。例如,我想插入一条新记录,然后调用更新函数来更新模型和视图,但这并没有发生。

这是"angular"做事的正确方法吗?

有什么提示吗?我做错了什么?

提前致谢

您可以使用单独的服务来缓存数据,而不是使用全局变量在控制器之间共享数据,因为Angular服务是单例的。

所以在你的情况下,创建一个服务

myApp.service('modelService',function() {
    var model = {
      myTable: [],
      anotherTable: []
    };

    return model;
});

然后在你的工厂里,注入这个服务,把你的updateModel改成

var updateModel = function(tableName, data){
    modelService.myTable = data;
};

然后在你的控制器中,注入 modelService 并将其绑定到 $scope 作为

$scope.model = modelService;

最后,在你看来,你可以访问model.myTable,一旦你在你的工厂更新它们就可以自动更新。