2017-01-30 46 views
0

У меня возникла проблема с предикатом фильтра с использованием BreezeJS. Когда я присваиваю значение одному конкретному фильтру набора фильтров, я получаю ошибку клиента (браузера): «Левая часть бинарного предиката не может быть литеральным выражением, оно должно быть допустимым выражением свойства или функционального предиката:левая сторона проблемы двоичного предиката с BreezeJS

Я также использую KnockoutJS, и у меня есть вспомогательные функции, чтобы сместить предикат (ы) вместе, но я не делаю ничего по-другому с этим конкретным фильтром, который не работает.

Я сравнил этот предикат с тем, который создан из другого фильтра, который работает, и насколько я могу судить, оба предиката идентичны в том, как они должны быть, и я не вижу любые несоответствия, которых не должно быть. Один из МСП предложил проверить мой корпус, но это не проблема (я могу сказать) - 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()); 
}, 

Наконец, здесь есть предикат установить, прежде чем он отправляется на сервер, чтобы проиллюстрировать два фильтра снова в основном идентичен:

enter image description here

в комментарии ниже, я указал, что даже после того, как меняется все на сервере и на клиенте, чтобы использовать «тупой», я все еще получаю ту же ошибку: enter image description here

+0

При внесении еще нескольких изменений и рассмотрении сетевой панели в инструментах разработчика эта ошибка возникает перед отправкой запроса на контроллер, который должен быть выполнен - ​​это полностью проблема с клиентом. – monkeydeus

+0

Я понял вопрос. Я изменил сущность, которую я использовал, чтобы вытащить пользовательский интерфейс из базовой таблицы в составное представление. Действие на контроллере бриза имело то же имя, что и основной объект таблицы. Когда я обновил базовый источник, я изменил действие, чтобы вернуть правильный набор типов, но имя действия оставалось неизменным.Таким образом, когда наступило время создания предиката, значение по умолчаниюResourceName, созданное ветром, по-прежнему оставалось прежним, а не новым. Так получилось, что это единственный фильтр, который иллюстрирует эту конкретную проблему. – monkeydeus

ответ

0

Корпус отличается от GoofyGuy и всего остального. Например .:

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

Я думаю Бриз camelCasing имя (с помощью NamingConvention), а затем пытается соответствовать (на стороне клиента) имя свойства. Итак:

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

Изменение self.GoofyGuy к self.goofyGuy везде, и это должно исправить.

+0

Я посмотрю, поможет ли это конкретное изменение. Я на 99% уверен, что это был goofyGuy, прежде чем я изменил его на все кепки, поэтому я не могу точно сказать, что изначально столбец назывался «State», а соответствующее свойство объекта js было «state», , поэтому я изменил его, чтобы избежать возможных столкновений в библиотеке breeze, но он уже прошел пару перестановок. Ваше предложение заставляет меня думать, что мне нужно просмотреть ВСЕ мои оболочки, поэтому, я попробую кое-что и опубликую свои результаты, если они есть. – monkeydeus

+0

Я изменил модель EF, чтобы использовать «Goofy», и изменил клиентскую сторону, чтобы использовать «goofy», и это привело к выбросу той же ошибки. Другие фильтры, в которых свойство сервера имеет одно слово с заглавной буквой, а клиентская сторона - одно слово в нижнем регистре, работа, например, в приведенном выше - «Приоритет» – monkeydeus

+0

Это обескураживает: изменилось свойство серверной стороны на «goofy» и даже с клиентом -side свойство, являющееся «goofy», по-прежнему вызывает ту же ошибку. – monkeydeus

 Смежные вопросы

  • Нет связанных вопросов^_^