1

コンテキスト: 私は、「真面目な javascript/jquery コーディング」と考えるのが好きなことにはまったく慣れていません。私の以前の試みは、おそらく反逆罪と見なされるでしょう :P.

私の質問: クライアント側のビュー モデルのいくつかにパターンがあることに気付き、それらのいくつかを 1 つの .js ファイルに統合したいと考えています。

サーバーから返された JS オブジェクトに必ずしもマップされるとは限らない、監視対象の追加セットを作成する必要がある画面を除いて、ほとんどのシナリオですべてが機能しているようです。

 var AdminPages = AdminPages || {};  

 AdminPages.SimplePageVM: function (options) {

            var self = this;

            self.hasChanges = function () {};        
            self.isValid = function () {};

            // CRUD Actions
            self.get = function () {
                $.ajax({
                   url: options.getUrl,
                   dataType: 'json',
                   data: !$.isEmptyObject(options.someId) ? { someId: options.someId} : null,
                   success: function (result) {            
                       self.observables = ko.mapping.fromJS(result);
                       ko.editable(self.observables);
                       ko.applyBindings(self, $('form')[0]);
                   },
                   error: function (result) {}
                });
            };
            self.save = function () {};
            self.edit = function () {};
            self.cancel = function () {};

            // Initialise the viewmodel on create
            self.get();                      
  }

ビューモデルに以下を追加したいと思います。完全に新しいオブジェクトを作成する必要があると考えています (self.observables は get 関数の成功時にのみ作成されるため)、新しいオブジェクトとそのプロパティをアイテム バインドに追加します。

追加したいID:

 self.newObject.IsPercentageEvaluation = 
            ko.computed(function () {
                var isPercentage = self.observables.IsPercentageBased() == 'true';    
                  if (isPercentage) {                        
                      self.observables.BalancePercentage('40');
                  } else {
                      self.observables.BalancePercentage('');
                  }
                return isPercentage;
            });

そして、それをすべて呼び出すには:

$(function () {
        var obj = {
             IsPercentageEvaluation = ko.computed(...);
        };

        AdminPages.SimplePageVM({
            getUrl: '@Url.Action("Get", "SomeController")',
            editUrl: '@Url.Action("Update", "SomeController")',
            organisationId: '@ViewBag.OrganisationID',
            newObject: obj
        });

} ($));

これがこの状況にアプローチする正しい方法であるかどうかを確認したいのですが?または、特定のJavaスクリプトパターンを利用するなど、より良い方法がある場合、またはその程度のものはありますか?

4

1 に答える 1

1

私は去年の春に大規模なプロジェクトに取り組み、あなたが使用しているものと同様のパターンに従ってみました。

考慮する必要がある問題があります-

  • ajax.success関数内では、返されるビューモードを変更する機能が日常的に必要でした。たとえば、ko.computedを追加します。ko.applybindingsの前に呼び出すオーバーライド可能な関数を追加することをお勧めします。
  • アプリケーションでデータの返送に問題がある状況を処理する機能が必要です。たとえば、データベースがダウンしているか、Webサービスがオフラインになっています。これらの状況を適切に処理する方法が必要です。これらの条件が別々のプロパティで返されるように、ビューモデルを拡張することでこれを行いました。
  • テーブルデータに表示する行データを返す場合は、データの配列を処理するようにajax.success関数を変更する必要がある場合があります。私たちはいつもこれで問題にぶつかったようでした。

私はあなたのビューモデルが好きです。これは、柔軟で拡張可能なコードです。次のプロジェクトで借ります。

于 2012-11-12T09:45:21.097 に答える