問題タブ [revealing-module-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
339 参照

javascript - View Model 関数バインディングは IE9 では検出されませんが、FF および Chrome では機能します

更新 実装を考えると、この質問に従うのは難しいと思います。実際のサンプルを見てテストするには、ソリューションをダウンロードしてください。

テストするには IE9 を使用する必要があり、開発ツールを開くことはできません。開発ツールを開くと、プロジェクトが期待どおりに機能します。このソリューションは、他のブラウザでも問題なく機能します。テストのために、ソリューションを IIS 内でローカルにセットアップし、VS /debug の外で実行しました。


ノックアウトオブザーバブルをサーバーに保存しようとしているプロジェクトがあります。IE9 で、説明できない本当に奇妙なことがいくつか見られます。誰かが私を助けてくれることを願っています。私はノックアウトと共に Asp.NET Mvc を使用しており、プロジェクトのこの部分の JS 公開モジュール パターンを実装しています。私のjsファイルは次のとおりです。

  • パターンを明らかにするためのReportwriter.jsのhtmlへの基本的なバインディング
  • ReportWriterEffects.js これには、UI が生成し、ノックアウト ビューモデルに渡されるすべてのイベントが含まれます。
  • ReportWriterUtilities.js. これには、ビューモデル内のデータ/オブジェクト操作のための関数が含まれています
  • ReportWriterViewModel.js ReportWriter ビューモデル Json シリアライゼーション/シリアライゼーション。

私のhtmlページには次の要素があります

これをクリックすると、目立たないイベントがReportWriterEffects.js

ReportWriterViewModel.jsこれは、次のように見えるから順番に呼び出す必要があります

ajax呼び出しが行われるreportWriterUtilities.jsファイルに私のレポートオブザーバブルを渡します

Firefox と Chrome では、これはすべて機能し、レポートは保存されます。ただし、IE 内では、save 呼び出しは呼び出されません。<a>私はもともと、決して呼び出されなかった要素にノックアウトバインドを設定していました。Mvcを使用していたので、ブラウザのキャッシュがこれに影響を与えている可能性があると考えたので、コントローラーのコンストラクターに次の属性を追加して、キャッシュをロードしないようにコントローラーを装飾しました

まだサイコロはありません。

ajax 呼び出しを見ると、私が追加したcache: false考えが役立つ可能性があることもわかります。まだ何もありません。

アラートメッセージを追加しましたが、それは呼び出されますが、context.$root.Save(); 呼び出されることはありません。

ここに本当に奇妙なことがあります。IE9 でページをロードし、F12 を押して IE で開発ツールを開き、開発ツールを閉じると、viewmodel 内の保存機能が呼び出され、すべてが機能します。ブラウザーを開いて開発ツールを起動し、ページに移動すると、すべてが機能します。コンソールにエラーやメッセージは生成されず、他のブラウザー内ではすべて正常に動作します。IE 10 は正常に動作するため、これは IE9 に分離されているようです。

誰か提案がありますか、過去にこのようなことを経験したことがありますか. これが発生する原因についての洞察をいただければ幸いです。以下のコードで十分だと思います。ここでは明らかにするパターンを使用しており、コードを正確に表現できないため、フィドルを使用できません。

0 投票する
4 に答える
20898 参照

javascript - モジュールパターン - 1 つのモジュールのコードを異なる js ファイルに分割する方法は?

モジュールパターンについては、次のようなことをしています:

コードを分割するにはどうすればよいですか? 名前空間の階層を使用したり、window.myGlobalNamespace.additionalFunc = function () {//blabla}. 他の方法は何ですか?長所と短所は何ですか?どちらがより良い習慣と考えられていますか?

2 つの回答はどちらも RequireJS を示唆しています。RequireJS がこれらの問題をどのように解決できるか説明してください。

first.js:

second.js:

main.js:

そして人はできる

コードの動作を変更するには!

ここで、次の 2 つの問題があります。

  1. 子からはアクセスできるが、外部のパブリックにはアクセスできない (つまり、保護されている) フィールドを持つことはできません。それを達成する方法はありますか?

  2. そうでない場合、つまり、eparentPrivate にアクセスできるようにしたい場合は、公開する必要があります。その後、ユーザーはそれを変更できるようになります!

さらに、すべてのパブリック関数を変更および置換できます。そうなってほしくない。

RequireJS がこれらの問題をどのように解決するのかわかりません。誰かが光を当てることができますか?

0 投票する
1 に答える
289 参照

knockout.js - 公開プロトタイプ パターンの配列内の「this」

OKみんな-これに頭をぶつけていました。これは、Revealing Prototype パターンから構築されたクラスの配列を使用する際の「ポインター」の問題だと思います。また、バインディングにノックアウト js を使用しています。

問題:通常、自分のサイトには非常に複雑なページがあります。その結果、他のクラスの配列を含むクラスを持つ傾向があります。私は常に Revealing Prototype Pattern を使用しており、通常はinit関数で「 this」を指す「 self」変数を持っているため、イベント ハンドラーによって呼び出されるそのクラスの他の関数はthisへのポインターを持ちます(そしてそれは失敗しません-「自己」が何であるかを知っているようです)。

しかし....クラス(モデル)の配列があると、正しく機能しません....私のMailModelクラス(私のビューモデル)にはPeopleクラスの配列あります... Peopleクラスの self がポイントされます「this」に、しかしプロトタイプの他の関数が「self」を呼び出すと、配列内の最後の「person」項目を指しているようです?? -インスタンス化するすべてのクラスで共有関数として「自己」を何らかの形で公開しています..そして、どういうわけか「これ」の最後のインスタンスを指していますか??

「Person」クラスの配列を含むビューモデルの簡単なモックアップを作成しようとしました。誰かがこれを理解するのを手伝ってください。「Person」クラスでこの「this」ポインターを使用するさまざまな方法を試しましたが、役に立ちませんでした。

見てみな!

http://jsfiddle.net/N8vxr/ .

アップデート:

呼び出しで「これ」を使用しない理由を疑問に思っているコメントが表示されます-私の場合、人のインスタンスではないこれらのプロトタイプ関数を呼び出す他のものがあります(したがって「これ」は機能しません)-更新しました合計の totalNums KnockoutJS 計算関数を使用して Person プロトタイプを表示する私の jsFiddle - その関数に「this」を入れると、「this」は「Window」オブジェクトであるため失敗します - 以前と同様に、「self」を使用してそれを見ることができます" は、配列の最後の人を参照するだけです (全員の "totalNums" が 80 であることに注意してください (Suzy Chapstic)

その「totalNums」をコンストラクターに移動しても問題ありませんが、関数をプロトタイプに落としたいと思います。では、プロトタイプの計算された関数内の「this」インスタンスへの参照を取得するにはどうすればよいでしょうか?

この KnockoutJS 計算関数の更新されたフィドルは次のとおりです。

http://jsfiddle.net/Sj25M/

0 投票する
2 に答える
896 参照

javascript - モジュールパターンの公開変数が更新されていないことを明らかにする JavaScript

Revealing Module パターンで Angular サービスを使用しています。このサービスは、内部的に Web サービスから文字列リソースを取得し、'Strings' パブリック変数を介してそれらを利用できるようにします。サービス呼び出しが行われる前に参照されるため、プライベート 'strings' 変数を初期化する必要があります。

サービスから適切な文字列データを取得し、それをプライベート 'strings' 変数にコピーします。ただし、クライアントがパブリックの「文字列」を参照する場合、元の値は保持されています。

私が間違っていること、またはパブリックの「文字列」を更新する方法について何か考えはありますか?

サービス呼び出しは、返されたデータをプライベート 'strings' 変数に設定します。

非公開の「文字列」に次のものが表示されるようになりました (Chrome 開発者ツール経由):

それでも、Angular コントローラーでパブリックの「文字列」を参照する場合、「文字列」はまだプライベート「文字列」の元の値を参照しています。

リソース.文字列:

助言がありますか?

0 投票する
1 に答える
719 参照

javascript - 剣道のこのJavascript関数で使用されているthis.setが機能しないのはなぜですか

Kendo Mobile アプリがあり、Revealing Module パターンを使用して ViewModel を作成しようとしています。

私の HTML では、リストを gamesListDataSource にバインドします。OnInit では、データをフェッチしてから、データソースが変更されたことを HTML に通知する必要があります。このコードはすべて正常に動作します (ただし、データソースを直接公開できるので、ここで長い道のりを行っていると思います)。

1) この行をコメントアウトした場合: GamesListViewModel.refreshGamesList(dataSource); 次の行のコメントを外します: this.set("gamesListDataSource", dataSource); loadGamesList 関数で直接呼び出されるようにすると、「Uncaught TypeError: Object [object Object] has no method 'set'」でフォールオーバーします。

fetch() が非同期であるという事実と関係があると思いますが、別の関数を呼び出すとうまくいく理由がわかりませんか?

gamesList.js

gamesList.html

0 投票する
1 に答える
459 参照

javascript - angularjs で使用する正しいパターン

次の angularjs プロジェクト構造を使用しています。

言い換えれば、ファイルをタイプ (サービス/コントローラー/ディレクティブなど) ではなく、ロジックの目的 (ユーザー/共有/カートなど) でグループ化します。これが大規模プロジェクトの正しいアプローチであると読みました。

メインの application.js ファイルには、次のようなモジュールが含まれています。

次に、各モジュールには、関連するコントローラー/ディレクティブ/サービスなどが含まれます。

例: SharedModule.js

次に、個別のファイルごとにロジックを実装します。私の質問は、それぞれの個別のサービス/コントローラーのロジックを実装するには、どのデザイン パターンを使用すればよいですか?

私はこの本を読みました: http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/ これまでのところ、私の最愛のデザインパターンは「Revealing module pattern」で、これは一種のオムニ目的のデザインパターンです。他のプロジェクトで何度も使用しました(angularjsなし)。

しかし、angularjsでは使用できないようです。

$rootScope/$http などのすべてのものをモジュールに渡すにはどうすればよいですか?

これは今私にとってどのように機能するかです:

しかし、それが完全に正しいかどうかはわかりません。よろしければアドバイスいただけませんか?

0 投票する
2 に答える
3123 参照

javascript - モジュールパターンを明らかにするJavaスクリプトは、複数のオブジェクトを作成します

Revealing Module Pattern の方法でより良いコードを書くための提案が必要です。私はチュートリアルhttp://weblogs.asp.net/dwahlin/archive/2011/09/05/creating-multiple-javascript-objects-when-using-the-revealing-module-pattern.aspxに従っています。このパターンの基本を理解する。基本的な画像スライダーを作成しようとしています。jsfiddle リンクを確認してください。

http://jsfiddle.net/sWtDf/

私が知りたいのは -

1)コードレビュー後に同じカルーセル機能を書くより良い方法はありますか

2) 複数のオブジェクト(インスタンス)の作り方 やってみた -

これにより、エラー TypeError: Slider is not a function が発生します

3) グローバル関数とプライベート関数を保持する正しい方法ですか?

4) 提案があれば

お時間をいただきありがとうございます:)

0 投票する
3 に答える
1972 参照

javascript - 「パッチが必要な場合、パブリック関数をオーバーライドできない」とはどういう意味ですか。Addy の Revealing Module Pattern の説明で?

このパターンの欠点は、プライベート関数がパブリック関数を参照する場合、パッチが必要な場合にそのパブリック関数をオーバーライドできないことです。これは、プライベート関数が引き続きプライベート実装を参照し、パターンがパブリック メンバーには適用されず、関数にのみ適用されるためです。

彼がこれによって何を意味するかの例を誰かが持っていますか?

上記で参照されている Revealing Module Pattern へのリンク