0

問題が発生しました。エンティティを拡張してhasValidationErrorを公開します。それがなくても問題なく動作します。また、エンティティを追加する前にIDを指定すると、それも正常に機能することがわかりました。エンティティがクライアントで拡張されると、IDフィールドが自動生成されないのはなぜですか。

私は現在、少し異なるバージョンのコードを使用しています(この方法でエンティティを拡張する方が直感的です)が、それでも同じ方法でエラーが発生します。

       var Country = function () {
                           console.log("Country initialized");
                           var self = this;
                           self.Country_ID = ko.observable(""); 
                           self.Country_Code = ko.observable("");  
                           self.Country_Name = ko.observable().extend({
                               validation: {
                                   validator: function (val, someOtherVal) {

                                       return false;//val === someOtherVal;
                                   },
                                   message: 'Invalid Value!',
                                   params: 5
                               }
                           });

                           var prop = ko.observable(false);

                           var onChange = function () {
                               var hasError = self.entityAspect.getValidationErrors().length > 0;

                               if (prop() === hasError) {
                                   // collection changed even though entity net error state is unchanged
                                   prop.valueHasMutated(); // force notification
                               } else {
                                   prop(hasError); // change the value and notify
                               }
                           };

                           // observable property is wired up; now add it to the entity
                           self.hasValidationErrors = prop;

                           //dummy property to wireup event
                           //should not be used for any other purpose
                           self.hasError =  ko.computed(
                                                {
                                                    read: function () {
                                                        self.entityAspect // ... and when errors collection changes
                                                                .validationErrorsChanged.subscribe(onChange);
                                                    },

                                                    // required because entityAspect property will not be available till Query
                                                    // return some data
                                                    deferEvaluation: true

                                                });


                           self.fullName = ko.computed(
                                            function () {
                                                return self.Country_Code() + " --- " + self.Country_Name();
                                            });
                       };


                       store.registerEntityTypeCtor("Country", Country);

次に、ボタンをクリックして、次のコードを使用して新しいエンティティを作成しています。

          var countryType = manager.metadataStore.getEntityType("Country"); 
                           var newCountry = countryType.createEntity(); 
                           //newCountry.Country_ID(200); //if i add this line no errors occurs
                           newCountry.Country_Code("India");

                           self.list.push(newCountry);

                           manager.addEntity(newCountry); // validation error occurs right after this line

                           self.selectedItem(newCountry);
                           self.list.valueHasMutated();
4

2 に答える 2

0

おそらく何も悪いことはありません。IDの生成が失敗していることをどのように知っていますか?newCountryをマネージャーに追加した後の負の数ですか?そのはず。

発生している検証エラーは何ですか?それはCountry_IDに関連していますか?おそらく、Country_IDに検証制約(最小値など)がありますか?

エンティティ初期化子はaddhasValidationErrorsProperty意図したとおりに機能します。DocCodeサンプルに教育テストを追加しました(entityExtensionTests.jsの「addhasValidationErrorsProperty初期化子の登録後に従業員を作成できます」を参照)。これを書いている時点ではデプロイしていませんが、GitHubから入手できます。

Employeeこれは、ID ID(Employee_ID)を持つNorthwindエンティティで可能な限りあなたの例に従います。テストは、前の投稿で書いたイニシャライザーを追加することを示しています(あなたがそれを書き直したかもしれないのでではありません)。これは、新しい従業員のIDがマネージャーに追加される前はゼロであり、マネージャーに追加されると-1になることを示しています。-1は、新入社員の一時IDです。保存後に永続的な値を受け取ります。

EntityManagerのデフォルトvalidationOptionsは、エンティティがマネージャーにアタッチ(または追加)されたときにエンティティを検証するように設定されています。ニーズに合わせてその動作を変更できます。

新しい従業員は、作成時に無効な状態になっています。必要な姓と名の値がありません(テストではこれらのエラーが表示されます)。したがって、hasValidationErrorsオブザーバブルtrueは新しい従業員をマネージャーに追加した後になり、hasValidationErrorsオブザーバブルはノックアウトUIが聞く変更通知を生成します。これらのテストは、これら2つのポイントを示しています。

于 2013-01-04T21:52:51.947 に答える