サーバー上のリソースの状態を変更するボタンのあるページがあります。すべてが配線され、正常に動作しています。しかし、アクション URL の新しいテンプレートを表示したくないため、ブラウザーを「戻す」サーバー応答に頼らなければなりませんでした。
これはよくあることのように思えます: サーバーに何かを依頼してから、リソースの現在の状態を取得し、テンプレートを再取得せずに現在のテンプレートに再表示します。
ページのマークアップは次のようになります。
<a ng-href="/api/preference/{{video._id}}/add_to_watchlist" data-method="get">
<i rel="tooltip" data-original-title="Add to watchlist" class="icon-3x action-icon
icon-plus-sign" ng-class="{iconSelected : video.user_watchlist == 1}">
</i>
</a>
これにより、$scope.video.watchlist の値に応じてアイコンが強調表示されます。クリックすると、サーバー上でカスタム アクションが起動され、視聴中のビデオが現在のユーザーのウォッチリストに追加されます。作成された URL は /api/preference/{{video._id}}/add_to_watchlist です。これにより、サーバー コントローラーが起動され、正しいことを実行しますが、/api/preference/{{video._id}} のテンプレートに移動する代わりに/add_to_watchlist サーバーは、Rails に「戻る」ようにクライアントに指示することで応答しますredirect_to :back
。
明らかにこれは間違っています。機能しますが、ページ全体のマークアップとデータを再取得します。
元のデータをロードする AngularJS コントローラーは次のとおりです。
GuideControllers.controller('VideoDetailCtrl', ['$scope', 'Video',
function($scope, Video) {
var pattern = new RegExp( ".*/([0-9,a-f]*)", "gi" );
//ugh, there must be a better way to get the id!
$scope.video = Video.get({ id: pattern.exec( document.URL )[1] });
}
]);
jsonを取得するリソースは次のとおりです
var VideoServices = angular.module('VideoServices', ['ngResource']);
VideoServices.factory('Video', ['$resource',
function($resource){
return $resource("/api/videos/:id", {id: "@id"}, {
update: {method: "PUT"},
query: {
isArray: true,
method: "GET",
headers: {
"Accept": "application/json",
"X-Requested-With": "XMLHttpRequest"
}
},
get: {
isArray: false,
method: "GET",
headers: {
"Accept": "application/json",
"X-Requested-With": "XMLHttpRequest"
}
}
});
}
]);
どういうわけか私はする必要があります
- ブラウザの URL を変更せずにサーバーに add_to_watchlist を指示する
- テンプレートをリロードせずにビデオ json の再フェッチをトリガーします。