Breezejs将EntityState从“添加”翻转为“保存前修改”
我正在按照John Papa的Jumpstart中提供的指导建造水疗中心。 当我创建模型时,它已经 modelObservable().entityAspect.entityState.isAdded()=true 我更新文本、下拉列表和 modelObservable().entityAspect.entityState.isAdded()=false 在我的数据上下文中:Breezejs将EntityState从“添加”翻转为“保存前修改”,breeze,Breeze,我正在按照John Papa的Jumpstart中提供的指导建造水疗中心。 当我创建模型时,它已经 modelObservable().entityAspect.entityState.isAdded()=true 我更新文本、下拉列表和 modelObservable().entityAspect.entityState.isAdded()=false 在我的数据上下文中: var createProject = function (position) { retu
var createProject = function (position) {
return manager.createEntity(entityNames.project,
{
positionId : position.id(),
start : position.start(),
memberId : position.memberId()
});
};
从我的添加视图模型调用:
define(['services/datacontext', 'durandal/plugins/router', 'durandal/system', 'durandal/app', 'services/logger', 'services/uiService'],
function (datacontext, router, system, app, logger, ui) {
var model = ko.observable();
var position = ko.observable();
var hourTypes = ko.observableArray([]);
var isSaving = ko.observable(false);
// init
var activate = function (routeData) {
logger.log('Add View Activated', null, 'add', true);
var positionId = parseInt(routeData.id);
initLookups();
return datacontext.getPositionById(positionId, position).then(**createProject**);
};
var initLookups = function () {
logger.log('initLookups', null, 'add', true);
hourTypes(datacontext.lookups.hourTypes);
};
// state
**var createProject = function () {
return model(datacontext.createProject(position()));
}**
var addNewProject = function () {
if (position == undefined || position().id() < 1) {
console.log('callback addNewProject');
setTimeout(function () {
addNewProject();
}, 1000);
} else {
datacontext.addProject(position(), model);
console.log(model().id());
return;
}
}
var **save** = function () {
isSaving(true);
**datacontext.saveChanges()**
.then(goToEditView).fin(complete);
function complete() {
isSaving(false);
}
function goToEditView() {
isSaving(false);
var url = '#/Projects/';
router.navigateTo(url + model().id());
}
};
var vm = {
activate: activate,
hourTypes: hourTypes,
isAdded: isAdded,
model: model,
save: save,
title: 'Details View'
};
return vm;
});
定义(['services/datacontext'、'durandal/plugins/router'、'durandal/system'、'durandal/app'、'services/logger'、'services/uiService'],
功能(数据上下文、路由器、系统、应用程序、记录器、用户界面){
var模型=ko.可观察();
var位置=可观察的ko();
var hourTypes=ko.observearray([]);
var isSaving=ko.可观察(假);
//初始化
var激活=功能(路由数据){
log('Add View Activated',null,'Add',true);
var positionId=parseInt(routeData.id);
initLookups();
返回datacontext.getPositionById(positionId,position)。然后(**createProject**);
};
var initLookups=函数(){
log('initLookups',null,'add',true);
hourTypes(datacontext.lookups.hourTypes);
};
//陈述
**var createProject=函数(){
返回模型(datacontext.createProject(position());
}**
var addNewProject=函数(){
if(position==未定义的| | position().id()<1){
log('callbackaddnewproject');
setTimeout(函数(){
addNewProject();
}, 1000);
}否则{
datacontext.addProject(position(),model);
console.log(model().id());
返回;
}
}
变量**保存**=函数(){
isSaving(正确);
**datacontext.saveChanges()**
.然后(goToEditView).fin(完成);
函数完成(){
isSaving(假);
}
函数goToEditView(){
isSaving(假);
var url='#/Projects/';
router.navigateTo(url+model().id());
}
};
var vm={
激活:激活,
小时类型:小时类型,
伊萨德:伊萨德,
模型:模型,
保存:保存,
标题:“详细信息视图”
};
返回虚拟机;
});
html
<section data-bind="with:model">
<h1 data-bind="text: name"> <i class="icon-asterisk" data-bind="visible: hasChanges" style="font-size: 30px;"></i></h1>
<div class="errorPanel"></div>
<div id="overview" class="project" >
<div class="row">
<div class="span4">
<label class="requiredLabel">Name*</label>
<input type="text" name="name" data-bind="value: name" style="width: 27em;" class="required" placeholder="Project Name" required validationMessage="Project Name required" /><span class="k-invalid-msg" data-for="title"></span>
</div>
</div>
<div class="row">
<div class="span3"><label class="requiredLabel">Start*</label></div>
<div class="span3"><label class="requiredLabel">End</label></div>
</div>
<div class="row">
<div class="span3"><input name="start" data-bind="shortDate: start" class="date required" required="required" placeholder="mm/dd/yyyy" style=" width:142px"></div>
<div class="span3"><input name="end" data-bind="shortDate: end" class="date" placeholder="mm/dd/yyyy" style=" width:142px"><span class="k-invalid-msg" data-for="end"></span></div>
</div>
<br/>
<div class="row">
<div class="span3"><label for="hourType" class="requiredLabel">Measure As*</label></div>
<div class="span2"><label for="hoursPerWeek" class="requiredLabel">Hours/Week</label></div>
<div class="span2"><label for="totalHours" class="requiredLabel">Total Hours</label></div>
</div>
<div class="row">
<div class="span3">
<select id="hourType" data-bind="options: $parent.hourTypes, optionsText: 'name', value: hourType" required validationMessage="Measure As required"></select><span class="k-invalid-msg" data-for="hourType"></span>
</div>
<div class="span2">
<input name="hoursPerWeek" type="number" min="1" max="120" required="required" data-bind="value: hoursPerWeek, validationOptions: { errorElementClass: 'input-validation-error' }, enable: hourType().id() == 1" class="hours required"" style="width: 80px;" validationMessage="Hours required"><span class="k-invalid-msg" data-for="projectHours"></span>
<span class="k-invalid-msg" data-for="totalHours"></span>
</div>
<div class="span2">
<input name="totalHours" type="number" min="40" max="2080" required="required" data-bind="value: totalHours, validationOptions: { errorElementClass: 'input-validation-error' }, enable: hourType().id() == 2" class="hours required"" style="width: 80px;" validationMessage="Hours required"><span class="k-invalid-msg" data-for="projectHours"></span>
<span class="k-invalid-msg" data-for="totalHours"></span>
</div>
</div>
<div class="row">
<div class="span4">
<label class="requiredLabel">Description*</label><span class="k-invalid-msg" data-for="description"></span><span id="posMinDesc" style="visibility:hidden"></span>
<textarea id="description" name="description" style="height: 200px; width: 650px;" data-bind="value: description, enabled:true, click: $parent.clearDefaults" rows="4" cols="60" class="richTextEditor k-textbox" required validationMessage="Description required" ></textarea>
</div>
</div>
</div>
<div class="button-bar">
<button class="btn btn-info" data-bind="click: $parent.goBack"><i class="icon-hand-left"></i> Back</button>
<button class="btn btn-info" data-bind="click: $parent.save, enable: $parent.canSave"><i class="icon-save"></i> Save</button>
</div>
</section>
名字*
开始*
终点
衡量为*
小时/周
总小时数
描述*
返回
拯救
微风发送给我的控制器的json是:
{
“实体”:[
{
“Id”:-1,
“说明”:“poi”,
“结束”:空,
“仪表”:0,
“分数”:0,
“HourTypeId”:1,
“每周小时数”:45,
“HourlyRate”:空,
“TotalHours”:空,
“加权小时数”:0,
“CreditMinutes”:0,
“TotalCompensation”:空,
“IsCurrent”:错误,
“名称”:“poi”,
“位置ID”:1,
“成员ID”:1,
“开始”:“2011-09-01T00:00:00Z”,
“未定义”:错误,
“实体方面”:{
“entityTypeName”:“项目:#SkillTraxx.Model”,
“defaultResourceName”:“项目”,
“实体状态”:“已修改”,
“原始值映射”:{
“名称”:“,
“HourTypeId”:0,
“每周小时数”:空,
“说明”:”
},
“自动生成密钥”:{
“propertyName”:“Id”,
“自动生成的密钥类型”:“标识”
}
}
}
],
“保存选项”:{}
}
正如您所看到的,上面的b/c状态是“Modified”,Id=-1,这是不正确的。这会在服务器端抛出一个错误。我想我可以捕获DbUpdateConcurrencyException,展开JObject并将“Modified”更改为added,但这会让代码变得很难闻
如果有人能帮我找到这一切中的掌心时刻,我准备好了。
谢谢你的关注 脸朝掌心
我接受了Jays的建议,开始剥离html,然后我意识到这是我的处理程序。
shortDate处理程序上的更新方法负责。我将其包装在if语句中,以便在添加当前状态时不发送更新
ko.bindingHandlers.shortDate = {
init: function (element, valueAccessor) {
//attach an event handler to our dom element to handle user input
element.onchange = function () {
var value = valueAccessor();//get our observable
//set our observable to the parsed date from the input
value(moment(element.value).toDate());
};
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var value = valueAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
if (valueUnwrapped) {
element.value = moment(valueUnwrapped).format('L');
if (!viewModel.entityAspect.entityState.isAdded())
{
**viewModel.entityAspect.setModified();**
}
}
}
};
您能试试modelObservable.entityAspect.entityState.isAdded()吗?谢谢您的帮助,但不幸的是,这样做行不通。这是一个只读值。model().entityAspect.entityState.isAdded(true);或model().entityAspect.entityState.isAdded()=true;我们无法告诉您在哪里添加了调用,在调用之前运行了什么代码,或者示例中的任何其他内容。我们不知道您在哪里调用entityState检查,但是如果您正在做一些您已经拥有可观察值的事情(例如在arrayForEach循环或其他东西中),您不需要()但可能不是这样,因为它应该抛出一个错误,只是刺穿了一个可能性。你能在测试entityState的地方发布代码吗?在浏览器中观察状态。当html呈现到屏幕上时,它处于“添加”状态,但当我点击“保存”时,它处于“修改”状态,因此发送到服务器的帖子注定失败。我一辈子都不知道为什么它会从“添加”变为“在封面下编辑”。只是出于好奇,你没有计算过canSave,这就是为什么吗