その場でアクションツリーを構築している場所で開発中のjavascriptアプリがあり、意図的に循環依存関係を導入したいという奇妙な状況に陥っています。最初の非常にハックな試みの後、JavaScript 変数スコープが実際にこれを解決するかなり合理的な方法を導入することを発見しました。私はまだ JavaScript の専門家ではないので、ベスト プラクティスについて意見を求めました。作業コードのスニペットを次に示します。
var Step = function(title, instructions, action) {
this.title = ko.observable(title);
this.instructions = instructions;
this.action = action;
};
var Action = function(cancelText, cancelDescription, cancelStep, nextDescription, addText, addStep, continueText, continueStep) {
this.cancelText = cancelText;
this.cancelDescription = cancelDescription;
this.cancelStep = cancelStep;
this.nextDescription = nextDescription;
this.addText = addText;
this.addStep = addStep;
this.continueText = continueText;
this.continueStep = continueStep;
};
var PersonalStep = new Step(
"Contact Information",
"How can we contact you about your awesome assortment of vehicles? Fill out the form below",
new Action(null, null, null, null, null, null, null, null)
);
var AddVehicleStep = new Step(
"Additional Vehicle",
"You have another car? Great, tell us about it too!",
new Action("Cancel",
"No, nevermind about this vehicle.",
PersonalStep,
"Add another vehicle?",
"+ Add",
AddVehicleStep, // This is the weird bit to me
"No, continue on",
PersonalStep)
);
var VehicleStep = new Step(
"Vehicle Details",
"Tell us about your primary vehicle by filling out the form below.",
new Action(null, null, null,
"Add another vehicle?",
"+ Add",
AddVehicleStep,
"No, continue on",
PersonalStep)
);
したがって、実際には、ユーザーがフォームで「追加」アクションを選択すると、AddVehicleStep は追加の車両を継続的に追加できます。ほとんどの言語 (私がよく知っている言語) では、AddVehicleStep 変数は独自のコンストラクター内からの解析に失敗します。これは私にとって非常に奇妙で、JS のこのイディオムについてもっと知りたいと思っています。このようなオブジェクト ツリーをオンザフライで実行するためのより良い方法はありますか?
また、解析可能になるように、ステップ変数を意図的に逆の順序で宣言していたのではないかと考えるようになりました。独自のコンストラクターで変数を参照することについての私の発見により、これは必要ではないと信じるようになりました。しかし、私はそれをテストしたところ、VehicleStep の後に AddVehicleStep var を移動すると、VehicleStep が取得null
されますaction.addStep
。この制限を回避し、変数を任意の順序で宣言できるようにする方法はありますか? 空白の宣言を使用し、後でそれらを設定すると機能しますか? 例えば
var a;
var b;
var a = new Step(b);
var b = new Step(b);
// a should now have the full instantiated object of b within it, right?
// (provided the step constructor assigned it, of course)
これはおそらく他の場所で回答されていますが、それを表示するキーワードが見つかりませんでした...
また、基本的にダイアログ/フォーム ウィザードを実装する Knockout.js アプリの一部としてこれらの手順を使用しています。
更新 昨夜、JSフィドルでこれを機能させました。jsfiddleでの後続の実行間でjsメモリがどのように処理されるかについて何かがあることがわかりました。これにより、私が作業していた特定のウィンドウ(Chrome、最新バージョン)で動作しました。ただし、新しいウィンドウまたは新しいブラウザーで開くと、機能しなくなります。
本当に奇妙な部分は、どのブラウザーでも動作を再現できないことです。私の編集の 1 つは、別の方法で宣言されていて、何らかの方法でメモリに保持されていた可能性があります。私が狂っていないことを証明するために、それを複製できたらいいのにと思います...
助けてくれてありがとう!