2017-01-30 14 views
0

BreezeJSを使用してフィルタ述語で問題が発生しました。フィルタセットの特定のフィルタに値を代入すると、クライアント(ブラウザ)エラーが発生します。 'バイナリ述語の左辺はリテラル式ではありません。有効なプロパティまたは関数述語式でなければなりません:'バイナリ述語の左側にBreezeJSの問題があります。

私はKnockoutJSも使用していますが、私は述語をまとめるヘルパー関数をいくつか持っていますが、この特定のフィルターでは何もしません。

私はこの述語を、動作する別のフィルタから作成されたものと比較しました。そして私が知る限り、2つの述語は、それらが仮定されている方法で同一であり、そこにはいけない矛盾があります。あるSMEが私のケースをチェックすることを提案しましたが、それは問題ではありません(私が知ることができます)。 - IOW、ケーシングはdbとビューモデルの間で一貫しています。誰にでも提案はありますか?

コード:ここで

がそよ風コントローラによって送信されたメタデータが動作しないフィルタ(GoofyGuy)のため、そして、あなたがメタデータは基本的に同じである見ることができないもののために、ありますここで

{ 
"name": "GoofyGuy", 
"type": "Edm.String", 
"nullable": "false", 
"maxLength": "256", 
"fixedLength": "false", 
"unicode": "true" 
}, 
{ 
"name": "Priority", 
"type": "Edm.String", 
"nullable": "false", 
"maxLength": "256", 
"fixedLength": "false", 
"unicode": "true" 
}, 

htmlが結合されています。ここでは

<select data-bind="value: GoofyGuy().filterValue"> 
    <option value="">Select</option> 
    <option>Approval Hold</option> 
    <option>Approved</option> 
    <option>Deleted</option> 
    <option>Executed</option> 
    <option>Execution Hold</option> 
    <option>Off Hold</option> 
    <option>Submitted</option> 
    <option>Verification Hold</option> 
    <option>Verified</option> 
</select> 

はモデルです:

function Filter_ChangeRequest(canViewOthers) { 
var self = this; 
self.filterName = '', 
self.filterType = 'changeRequest', 
    self.dateCreated = ko.observable(''); 
self.isActive = ko.observable(true), 
self.submitter = ko.observable(new FilterValue()), 
self.deadline = ko.observable(new FilterComparison()), 
self.priority = ko.observable(new FilterValue()), 
self.GoofyGuy = ko.observable(new FilterValue()), 
self.requestId = ko.observable(new FilterValue()), 
self.itemTitle = ko.observable(new FilterValue()), 
self.domain = ko.observable(new FilterValue()), 
self.policyWaiver = ko.observable(new FilterValue()), 
self.submitDate = ko.observable(new FilterComparison()), 
self.approvedBy = ko.observable(new FilterValue()), 
self.description = ko.observable(new FilterValue()), 
self.canViewOthers = canViewOthers, 
self.submitters = ['amr\\maburke', 'amr\\jdkraft'], 
self.idsid = ''; 

self.setInitialValues = function() { 
    self.submitter(new FilterValue('SubmittedByIdsid')); 
    self.deadline(new FilterComparison('DeadlineRequested')); 
    self.priority(new FilterValue('Priority')); 
    self.GoofyGuy(new FilterValue('GoofyGuy')); 
    self.requestId(new FilterValue('RequestId')); 
    self.itemTitle(new FilterValue('Title')); 
    self.domain(new FilterValue('Domain')); 
    self.policyWaiver(new FilterValue('IncludesPolicyWaiver')); 
    self.submitDate(new FilterComparison('SubmitDate')); 
    self.approvedBy(new FilterValue('ApprovedBy')); 
    self.description(new FilterValue('Description')); 
    self.submitters = ['amr\\maburke', 'amr\\jdkraft']; 
}; 

self.init = function() { 
    self.setInitialValues(); 


}; 
self.clear = function() { 
    self.setInitialValues(); 
}; 

self.populate = function (filterValues) { 
    if (self.canViewOthers) 
     self.submitter().populate(filterValues.submitter); 
    self.deadline().populate(filterValues.deadline); 
    self.priority().populate(filterValues.priority); 
    //self.GoofyGuy().populate(filterValues.GoofyGuy); 
    self.requestId().populate(filterValues.requestId); 
    self.itemTitle().populate(filterValues.itemTitle); 
    self.domain().populate(filterValues.domain); 
    self.policyWaiver().populate(filterValues.policyWaiver); 
    self.submitDate().populate(filterValues.submitDate); 
    self.approvedBy().populate(filterValues.approvedBy); 
    self.description().populate(filterValues.description); 
}; 

self.breezeFilter = function() { 
    var filterPredicates = ko.observableArray([]); 
    //breezeUtils.addPredicate(self.submitter(), filterPredicates); 
    //breezeUtils.addPredicate(self.deadline(), filterPredicates); 

    //if (self.stateX().filterValue() == '') 
    // //add != Deleted predicate 
    // filterPredicates.push(breeze.Predicate.create('StateNameX', breeze.FilterQueryOp.NotEquals, 'Deleted')); 
    //else 
    breezeUtils.addPredicate(self.GoofyGuy(), filterPredicates); 
    //breezeUtils.addPredicate(self.priority(), filterPredicates); 
    //breezeUtils.addPredicate(self.itemTitle(), filterPredicates); 
    //breezeUtils.addPredicate(self.domain(), filterPredicates); 
    //breezeUtils.addPredicate(self.policyWaiver(), filterPredicates); 
    //breezeUtils.addPredicate(self.submitDate(), filterPredicates); 
    //breezeUtils.addPredicate(self.approvedBy(), filterPredicates); 
    //breezeUtils.addPredicate(self.description(), filterPredicates); 
    //breezeUtils.addPredicate(self.requestId(), filterPredicates); 

    return breeze.Predicate.and(filterPredicates()); 

} 
}; 

そして、これらの述語をポップするヘルパー関数です:

var breezeUtils = { 
Predicate: breeze.Predicate, 
FilterQueryOp: breeze.FilterQueryOp, 
addPredicate: function (filter, predicateCollection) { 
    if (filter.filterValue()) { 
     //if there is a filter value, add it to the predicate collection 
     predicateCollection.push(this.getPredicate(filter)); 
    } 
}, 
getPredicate: function (filter) { 
    if (filter.hasOwnProperty('boundary') && filter.boundary()) { //compound predicate 
     var p1 = this.Predicate.create(filter.title, this.FilterQueryOp.GreaterThanOrEqual, filter.filterValue()); 
     var p2 = this.Predicate.create(filter.title, this.FilterQueryOp.LessThanOrEqual, filter.boundary()); 
     return this.Predicate.and([p1, p2]); 
    } 
    var operator = this.getQueryOperator(filter.valueComparison()); 
    return this.Predicate.create(filter.title, operator, filter.filterValue()); 
}, 

は最後に、ここでは2つのフィルタが再び基本的に同一であり、説明するためにサーバーに送信される前に設定述語は次のとおりです。

enter image description here

enter image description here

は、以下のコメントでは、私は、私はまだ同じエラーを取得しても、サーバーとクライアント上のすべてを変更した後、「間抜け」を使用することが示されました

+0

devツールのネットワークパネルを少し変更して見ると、このエラーは、クエリがコントローラに送信されて実行される前にスローされます。これは完全にクライアントの問題です。 – monkeydeus

+0

私は問題を理解しました。 UIをベーステーブルからコンポジットビューにポップするために使用していたエンティティを変更しました。 breezeコントローラのアクションは、基になるテーブルエンティティと同じ名前でした。基礎となるソースを更新したときに、正しいタイプのコレクションを返すようにアクションを変更しましたが、アクション名は変わりません。したがって、述語を作成する時間が来たとき、breezeによって作成されたdefaultResourceNameは、新しいエンティティではなく古いエンティティです。ちょうどそのように起こったのは、この特定の問題を説明する唯一のフィルターでした。 – monkeydeus

答えて

0

ケーシングは、GoofyGuyと他のすべてのものと異なって見えます。例えば:

self.priority(new FilterValue('Priority')); 
self.GoofyGuy(new FilterValue('GoofyGuy')); 

私はブリーズが(NamingConventionを使用して)名前をcamelCasing形式、その後、(クライアント側)プロパティ名と一致しようとしていると思います。だから、:どこでもself.goofyGuy

"Priority" -> priority // works 
"GoofyGuy" -> goofyGuy // Breeze can't find the property 

変更self.GoofyGuy、それはそれを修正する必要があります。

+0

その特定の変更が役立つかどうかがわかります。私はすべての帽子に変更する前にそれがgoofyGuyだったことを99%確信しています。なぜなら、最初は列が 'State'と呼ばれ、対応するjsオブジェクトプロパティが 'state'ので、私はそれを風のライブラリの可能性のある衝突を避けるために変更しましたが、それは既にいくつかの順列を経ています。あなたの提案は、私が私のケーシングのすべてを見直す必要があると思うようにするので、私はいくつかのことを試して、私の結果があれば投稿します。 – monkeydeus

+0

EFモデルを「Goofy」を使用するように変更し、クライアント側で「goofy」を使用するように変更したため、同じエラーがスローされました。上記のようなサーバプロパティが1語で、クライアント側の1語が小文字に変換されている他のフィルタは、「優先度」 – monkeydeus

+0

のように動作します。サーバー側のプロパティを「goofy」に変更しました。 'goofy'であるサイドプロパティは、同じエラーが発生します。 – monkeydeus

関連する問題