如何在AngularJS中执行数据库操作后更新列表

如何在AngularJS中执行数据库操作后更新列表,angularjs,Angularjs,我有一个简单的CRUD应用程序,运行在带有Apache和MySQL的Linux服务器上。数据库操作由PHP脚本完成。crud操作工作正常,服务器与开发机器位于不同的机器上 一切都很好,但当我尝试在创建、更新或删除操作后列出数据库中的项目时,列表有时会更新,有时不会 这是密码 index.html: <body ng-controller="GetScenesCtrl"> <ul> <li ng-repeat="scene in scen

我有一个简单的CRUD应用程序,运行在带有Apache和MySQL的Linux服务器上。数据库操作由PHP脚本完成。crud操作工作正常,服务器与开发机器位于不同的机器上

一切都很好,但当我尝试在创建、更新或删除操作后列出数据库中的项目时,列表有时会更新,有时不会

这是密码

index.html:

    <body ng-controller="GetScenesCtrl">

    <ul>
      <li ng-repeat="scene in scenes">
        <em><a href="#/getscene/{{scene.scene_id}}">{{scene.scene_name}}</a></em>
      </li>
    </ul>
控制器:

    App.controller('GetScenesCtrl', function($scope, Scenes, ScenesService) {

      $scope.scenes = Scenes.query(); 
      //$scope.scenes = ScenesService.setScenes();
      //$scope.scenes = ScenesService.getScenes();    

      //$scope.$on('updscenes', function(event, scenes) {
      //    $scope.scenes = scenes;
      //}); 

      $scope.updateScenes = function() {
            $scope.scenes = Scenes.query();  
      };

    });
好的,当index.html第一次加载时,我使用Scenes.query()方法初始化列表。updateScenes()-方法在CRUD-操作后被调用以更新作用域。此呼叫来自另一个控制器。像这样:

    App.controller('AddSceneCtrl', function($scope, Scenes, ScenesService) { 

    $scope.addScene = function(scene) {

     Scenes.add({         
                     nimi : scene.name,
                     sisalto : scene.content
                    });

        $scope.updateScenes();  
        //$scope.scenes = ScenesService.getScenes();    
        //ScenesService.setScenes();                      
    } 

    });
我尝试过的另一种更新范围的方法是广播方式,这两种方式的工作原理类似,有时列表没有更新。为什么会这样?一定有更好的方法,角度更好的方法。我是个有棱角的新手,所以这里一定有我错过的东西


斯通(Stone)

下面引用@Duncan的评论:

重要的是要认识到调用$resource对象方法会立即返回一个空引用(对象或数组取决于isArray)。从服务器返回数据后,现有引用将填充实际数据。这是一个有用的技巧,因为通常资源被分配给模型,然后由视图进行渲染。如果对象为空,则不会进行渲染,一旦数据从服务器到达,对象将填充数据,视图将自动重新渲染自身,显示新数据。这意味着在大多数情况下,不必为操作方法编写回调函数

可以使用以下参数调用类对象或实例对象上的操作方法:

使用(value,responseHeaders)参数调用成功回调。使用(httpResponse)参数调用错误回调

因此,你应该:

Scenes.add(
    {         
        nimi : scene.name,
        sisalto : scene.content
    }, 
    function() { // this function is invoked when the add is successful
        $scope.updateScenes();
    });
或者干脆

Scenes.add(
    {         
        nimi : scene.name,
        sisalto : scene.content
    }, 
    $scope.updateScenes);

您发布的代码似乎只是查询,没有显示任何更新。但是,我认为发生的情况是更新是异步的,因此如果在更新后立即获取数据,它可能会命中服务器上的另一个线程,并且结果实际上可以在原始更新完成之前返回。
$save()
方法使用一个回调函数,您可以使用该函数判断保存何时完成。是的,我在文章中添加了另一个控制器。我想这可能和时间有关。不幸的是,我是一个无所事事的人,我不知道该怎么做,
这个$save()方法使用了一个回调函数,您可以使用它来
。所以,如果你能详细说明我将如何做到这一点?好的,似乎工作!非常感谢。还有一个小问题:为什么
$scope.updateScenes
有效,而
$scope.updateScenes()
无效?上面的第二个片段与第一个类似。它将updateScenes函数传递给add()方法。当收到成功响应时,add()方法调用此updateScenes函数。将上面第二个代码段中的
updateScene
替换为
updateScenes()
,将调用updateScene函数,并将此函数的结果(可能未定义)传递给
add()
函数。
Scenes.add(
    {         
        nimi : scene.name,
        sisalto : scene.content
    }, 
    function() { // this function is invoked when the add is successful
        $scope.updateScenes();
    });
Scenes.add(
    {         
        nimi : scene.name,
        sisalto : scene.content
    }, 
    $scope.updateScenes);