У меня возникла проблема с предикатом фильтра с использованием 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());
},
Наконец, здесь есть предикат установить, прежде чем он отправляется на сервер, чтобы проиллюстрировать два фильтра снова в основном идентичен:
в комментарии ниже, я указал, что даже после того, как меняется все на сервере и на клиенте, чтобы использовать «тупой», я все еще получаю ту же ошибку:
При внесении еще нескольких изменений и рассмотрении сетевой панели в инструментах разработчика эта ошибка возникает перед отправкой запроса на контроллер, который должен быть выполнен - это полностью проблема с клиентом. – monkeydeus
Я понял вопрос. Я изменил сущность, которую я использовал, чтобы вытащить пользовательский интерфейс из базовой таблицы в составное представление. Действие на контроллере бриза имело то же имя, что и основной объект таблицы. Когда я обновил базовый источник, я изменил действие, чтобы вернуть правильный набор типов, но имя действия оставалось неизменным.Таким образом, когда наступило время создания предиката, значение по умолчаниюResourceName, созданное ветром, по-прежнему оставалось прежним, а не новым. Так получилось, что это единственный фильтр, который иллюстрирует эту конкретную проблему. – monkeydeus