1

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() メソッドを使用してリストを初期化します。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();                      
    } 

    });

私が試したスコープを更新する別の方法は、ブロードキャストの方法であり、どちらの方法も同様に機能し、リストが更新されないことがあります。どうしてこれなの?これを行うためのより良い方法、Angular の方法が必要です。私はAngularの初心者なので、ここで見逃したものがあるに違いありません。

結石

4

1 に答える 1

2

@Duncan からのコメントをフォローアップするには、ドキュメントからの引用を次に示します。

$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);
于 2013-08-16T14:47:39.327 に答える