0

データベースにたくさんの「キャンペーン」があります。

{"name" : "Apple", "status" : "active"}
{"name" : "Orange", "status" : "paused"}

私はそれらをAngularで表示しました:

<span ng-switch on="campaign.status"> 
<a ng-switch-when="active" ng-click='setStatus($index, "paused")'>Pause</a>
<a ng-switch-when="paused" ng-click='setStatus($index,"active")'>Activate</a>
</span> 

次に、コントローラーで、API(更新されたエントリのJSONを返す)を使用してサーバーのデータベースのステータスを更新します。

$scope.setStatus = function(index, newstatus) {

    var item = $scope.campaigns[index];
    var url = 'api.mysite.com/' + newstatus + '/' + item._id.$oid;

    if (! $scope.isComplete(item) )
    {
        $http({method: 'GET', url: url}).  
        success(function(data, status, headers, config) { 
           $scope.campaigns[index] = data; 
          }). error(function(data, status, headers, config) {
           console.log('Error communicating with the server.');
          }); 
    }
}

ここで、変数campaignsは、コントローラーが次のように初期化されたときにサーバーから取得されたすべてのキャンペーンの配列です。

$scope.connection = $resource('api.mysite/getallcampaigns');
$scope.campaigns = $scope.connection.query();

これはすでに本当に厄介なようで、AngularJSを間違って使用していると確信しています:(主なことは、変更している要素のインデックスをコントローラーに渡していることです。これは、配列を並べ替えると壊れます。 .Angularにこれをうまく接続させるにはどうすればよいですか?これを行うための最小限の正しい方法は何ですか?

4

1 に答える 1

0

キャンペーンをインデックスの代わりに setStatus() に渡します。成功のコールバックでキャンペーン プロパティを変更します。

<a ng-switch-when="active" ng-click='setStatus(campaign, "paused")'>Pause</a>

.

$scope.setStatus = function (campaign, newstatus) {
   ...
   success(function(data, status, headers, config) { 
       campaign.status = data.status;

成功のコールバックで配列全体を再割り当てしないでください。ビューのデータバインディングが壊れる可能性があります。
つまり、これはうまくいかないと思います:campaign = data

おそらく、データの初期配列の取得と個々の配列項目の変更の両方を処理できる 1 つの $resource オブジェクトを定義できます。$resource API ページの「クレジット カード リソース」の例を参照してください。配列の各項目cards(query() の結果が割り当てられる) も $save() できることに注意してください。

于 2013-01-26T06:28:49.513 に答える