ページの JavaScript を読み込むために requirejs を使用しています。ファイルから動的に読み取り、Newtonsoft JObject を使用して JSON を返す webApi ルートがあります。クライアント側では、結果を取得してローカルの JavaScript 変数に割り当てます。
define(['jquery'], function ($) {
function dynoFile() { $.get('/api/resources/dynofile', function (results) { myNamespace.dynoFile = results; }); } return new dynoFile(); });
この例は機能しますが、myNamespace.dynoFile の存在を予期する他の JavaScript ファイルで問題が発生します。このファイルは正常に読み込まれたため、他のファイルは $.get が完了するまで待機しません。
Web API メソッドが JavaScript だけを返すようにして、ブラウザーにそれを単なるテキストではなく JavaScript として認識させることは可能ですか? Web API に応答ヘッダーを設定し、生成されたスクリプトを返すさまざまな方法を試みました。
これは可能ですか?
アップデート:
もう少し詳しく説明すると、Web API を使用してリソース ファイルを処理し、JSON をクライアントに返します。これは単一ページのアプリであるためです。RequireJS を使用してロードできるように、Web API から JavaScript を返したいと思っていました。JSON として動作するようになりました。
リソース ファイルを読み取り、JSON として返す WebApi メソッドを次に示します。
public JObject Get()
{
var data = new JObject();
var type = typeof(Translations);
var properties = type.GetProperties();
foreach (var property in properties)
{
if (property.Name != "ResourceManager" && property.Name != "Culture")
{
data.Add( property.Name, property.GetValue(type, null).ToString());
}
}
HttpContext.Current.Response.Headers.Add("Content-Type", "application/json");
return data;
}
ここに私の translations.js ファイルがあります:
define(['jquery', 'underscore'], function ($) {
function translations() {
}
_.extend(translations.prototype, {
target: '/api/resources/translations',
getTranslations: function () {
return $.ajax({
url: 'api/resources/translations',
type: 'GET',
dataType: 'json'
});
}
});
return (translations);
});
他のファイルのいくつかは既存の翻訳に依存しているため、main.js で 2 つの RequireJS ステートメントをネストする必要がありました。
requirejs(['application/translations', 'whatever other resources that can load that don't depend on translations'], function () {
var trans = new translations();
trans.getTranslations()
.done(function (result) {
// set translations into a variable, we chose it to be part of the global namespace
window.Translations = result;
// load remaining dependencies that require translations to exist
requirejs(['myotherjsfiles', 'blahblah', function () {
// you get the idea...
});
});
});
これにより、翻訳を最初に (bootstrap、jquery などの依存しないファイルとともに) ロードし、その後、依存するすべての JavaScript ファイルをロードすることができます。また、これを RequireJs 最適化メソッドに対してテストしたところ、ネストされた require を解決できました。願わくば、これが翻訳をクライアントに渡す方法や、RequireJS を使用して動的モジュールをロードする方法について、他の誰かの助けになることを願っています。
WebApi で JavaScript を返す方法を知っている人がいたら、ぜひ教えてください。
乾杯!