BreezeJS编辑数据不起作用

时间:2014-08-28 05:48:31

标签: breeze

我能够按照添加数据的说明进行操作,这部分很容易理解。但是当我试图按照指令编辑数据时,我完全迷失了。

我正在关注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 ..并且没有任何工作方式符合我的要求。

帮助将不胜感激。

1 个答案:

答案 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天时间。