【发布时间】:2013-06-18 12:28:46
【问题描述】:
我正在按照 John Papa 的 Jumpstart 中提供的指导构建一个 SPA。 当我创建模型时,它有
modelObservable().entityAspect.entityState.isAdded() = true;
我更新了文本、下拉菜单和 modelObservable().entityAspect.entityState.isAdded() = false;
在我的数据上下文中:
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;
});
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”:空, “总小时数”:空, “加权小时”:0, “CreditMinutes”:0, “总补偿”:空, “当前”:假, “名称”:“poi”, “位置 ID”:1, “会员编号”:1, "开始": "2011-09-01T00:00:00Z", “未定义”:假, “实体方面”:{ "entityTypeName": "项目:#SkillTraxx.Model", "defaultResourceName": "项目", "entityState": "修改", “原始值映射”:{ “姓名”: ””, “HourTypeId”:0, "HoursPerWeek": null, “描述”: ”” }, “自动生成密钥”:{ "propertyName": "Id", “autoGeneratedKeyType”:“身份” } } } ], “保存选项”:{} }
如您所见,上述不正确的 b/c 状态为“已修改”且 Id = -1。这会引发服务器端错误。我想我可以捕获 DbUpdateConcurrencyException,展开 JObject 并将“Modified”更改为已添加,但它到处都是代码气味。
如果有人能帮我找到这一切中的掌声时刻,我已经准备好了。 感谢收看!
【问题讨论】:
-
你可以试试 modelObservable.entityAspect.entityState.isAdded() 吗?
-
感谢您与我们联系,但不幸的是,这不起作用。这是一个只读值。模型().entityAspect.entityState.isAdded(真);或 model().entityAspect.entityState.isAdded() = true;
-
我们无法判断添加了您调用的位置、调用之前运行了哪些代码,或者您的示例中的任何其他内容。我们不知道你在哪里调用 entityState 检查,但如果你正在做一些你已经拥有 observable 值的事情(例如在 arrayForEach 循环或其他东西中),你不需要 () 但 可能不是这样,因为它应该抛出一个错误,只是刺破一种可能性。您可以在测试 entityState 的地方发布代码吗?
-
在浏览器中观察状态。当html呈现到屏幕时它处于“添加”状态,但是当我点击保存时,它处于修改状态,所以到服务器的帖子注定要失败。我一生都无法知道为什么它会在幕后从添加更改为编辑。
-
只是出于好奇,您没有计算 canSave,这只是您没有复制的东西吗?此外,当您执行保存然后调用 goToEditView 时,您将保存设置为 false,并且在完成调用时再次设置,仅供参考。会继续寻找几个杰出的
标签: breeze