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

时间:2013-08-16 13:59:49

标签: angularjs

我在Apache和MySQL的Linux服务器上运行了一个简单的CRUD应用程序。数据库操作由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>

服务:

    angular.module('writServices', ['ngResource'])
      .factory('Scenes', function($resource){
        return $resource('/:id/:nimi/:sisalto/:pics', {}, {
          query: {
            url:'php/getscenes.php',
             method:'GET', 
             isArray:true
          }
    });

    App.service('ScenesService', function ($rootScope, Scenes) {      
      var scenes = [];

      this.setScenes = function() {
        scenes = Scenes.query();
        $rootScope.$broadcast('updscenes', scenes);
      };
      this.getScenes = function() {
        scenes = Scenes.query();
        return scenes;
      };        
    });

控制器:

    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()方法来初始化列表。在CRUD操作之后调用updateScenes()-method以更新范围。此呼叫来自另一个控制器。像这样:

    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();                      
    } 

    });

更新我尝试过的范围的另一种方法是广播方式,两种方式的工作方式类似,使列表有时不会更新。为什么是这样?这样做必须有更好的方式,Angular方式。我是Angular的新手,所以我必须在这里找到一些东西。

1 个答案:

答案 0 :(得分:2)

要跟进@Duncan的评论,这里是the documentation的引用:

  

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

     

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

HTTP GET "class" actions: Resource.action([parameters], [success], [error])
non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
non-GET instance actions: instance.$action([parameters], [success], [error])
  

使用(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);