我能够按照添加数据的说明进行操作,这部分很容易理解。但是当我试图按照指令编辑数据时,我完全迷失了。
我正在关注todo示例,该示例效果很好,但是当我尝试使用相同的原则添加到我自己的项目时,没有任何作用。
在我的控制器中,我有以下内容:
function listenForPropertyChanged() {
// Listen for property change of ANY entity so we can (optionally) save
var token = dataservice.addPropertyChangeHandler(propertyChanged);
// Arrange to remove the handler when the controller is destroyed
// which won't happen in this app but would in a multi-page app
$scope.$on("$destroy", function () {
dataservice.removePropertyChangeHandler(token);
});
function propertyChanged(changeArgs) {
// propertyChanged triggers save attempt UNLESS the property is the 'Id'
// because THEN the change is actually the post-save Id-fixup
// rather than user data entry so there is actually nothing to save.
if (changeArgs.args.propertyName !== 'Id') { save(); }
}
}
问题是,每当我更改视图上的控件时,都不会调用propertyChanged回调函数。
以下是该服务的代码:
function addPropertyChangeHandler(handler) {
// Actually adds any 'entityChanged' event handler
// call handler when an entity property of any entity changes
return manager.entityChanged.subscribe(function (changeArgs) {
var action = changeArgs.entityAction;
if (action === breeze.EntityAction.PropertyChange) {
handler(changeArgs);
}
});
}
如果我在这一行上设置了一个断点:
var action = changeArgs.entityAction;
在我的项目中,它永远不会到达那里;在todo样本中,确实如此!它完全跳过整个事情,然后加载视图。所以我的回调函数都没有工作;所以真的没有订阅。
因此,当我尝试保存更改时,manager.hasChanges()始终为false,并且数据库中没有任何反应。
我已经尝试了至少3天才能让这个工作起来,而且我完全惊讶于整个问题对我来说有多复杂。
注意:我正在使用JohnPapa的HotTowel模板。我试图将Todo编辑功能用于Tee ..并且没有任何工作方式符合我的要求。
帮助将不胜感激。
答案 0 :(得分:0)
我一直认为问题出在javascript客户端端。事实证明,当您创建投影DTO时,编辑不起作用。
所以在我的服务器端,我创建了一个查询:
public IQueryable<PersonDTO> getPerson(){
return (from _person in ContextProvider.Context.Queries
select new PersonDTO
{
Id = _person.Id,
FirstName = _person.FirstName,
LastName = _person.LastName
}).AsQueryable();
}
这只是投影DTO发送给客户端。这确实适用于我的应用程序获取数据和填充内容。所以这没有错。使用此功能,我可以添加项目和获取项目,但是没有信息允许实体管理员知道该项目。当我创建一个项目时,实体管理器有一个&#34; createEntity&#34;这让我告诉实体经理在我的情况下使用哪个项目:
manager.createEntity(person, initializeValues);
也许如果有一个&#34; manager.getEntity&#34;也许这会有所帮助吗?
无论如何,我改变了上面的查询,直接从源头获取:
public IQueryable<Person> getPeople(){
return ContextProvider.Context.People;
}
注意ContextProvider是:
readonly EFContextProvider<PeopleEntities> ContextProvider =
new EFContextProvider<PeopleEntities>();
因此,javascript中的subscribe方法会检查直接从上下文对象中检索到的信息。有趣。只是希望我没有花4天时间。