BreezeJS SaveChanges - undefined不是一个函数

时间:2014-05-21 21:21:17

标签: c# angularjs breeze

我对BreezeJS很新,我做错了什么,但不确定是什么。我正在为我的GET请求使用第三方API,并使用我自己的服务器后端来处理SaveChanges以单独向第三方发出每个请求,因为我无法将发布/置位请求自定义为确切的语法和发布数据格式我需要。

我们的模型是动态的(意味着客户可以添加新的属性/字段,然后从其余的api流向我们的客户端),这就是为什么代码看起来像下面那样,这是控制器:

    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    { 
        var context = JsonConvert.DeserializeObject<List<dynamic>>(saveBundle.SelectToken("entities").ToString());

        foreach (var entity in context)
        {
            foreach (JProperty obj in entity)
            {
                if (obj != null)
                {
                    // nothing right now but in future persist somehow
                }
            }
        } 
        // Construct the save result to inform the client that the server has completed the save operation
        var keyMappings = new List<KeyMapping>();
        return new SaveResult()
        {
            Entities = context.Cast<object>().ToList(),
            Errors = null,
            KeyMappings = keyMappings
        }; 
    }

调用堆栈如下所示:

TypeError: undefined is not a function
    at http://localhost:5749/Scripts/breeze.debug.js:14114:51
    at http://localhost:5749/Scripts/breeze.debug.js:235:26
    at Array.map (native)
    at __map (http://localhost:5749/Scripts/breeze.debug.js:234:15)
    at proto.visitAndMerge (http://localhost:5749/Scripts/breeze.debug.js:14111:16)
    at http://localhost:5749/Scripts/breeze.debug.js:12806:48
    at __using (http://localhost:5749/Scripts/breeze.debug.js:395:16)
    at Object.processSavedEntities (http://localhost:5749/Scripts/breeze.debug.js:12794:13)
    at saveSuccess (http://localhost:5749/Scripts/breeze.debug.js:12776:67)
    at deferred.promise.then.wrappedCallback (http://localhost:5749/Scripts/angular.js:11046:81) undefined 

我将它追溯到proto.visitAndMerge中的这一行(breeze.debug.js中的第14114行):   if(node.entityAspect.entityState.isDeleted()){

如果你认为我做了一些愚蠢的话,那我也都是耳朵。可以修改第三方API以相应地执行GET,但是没有什么可以处理SaveChanges包,所以据我所知这是我需要做的。

任何建议都会很棒。

作为参考,我试图遵循这种模式:Breezejs SaveChanges: is it possible to return a custom SaveResult object, somehow?

1 个答案:

答案 0 :(得分:2)

我明白了。 entityAspect随请求一起发送。因此,将其转换为动态对象会创建一个entityAspect属性,然后我将其发送回客户端。需要删除此entityAspect,以便它不会干扰JavaScript对象。

这是一些代码,也许有一天会帮助某人:

var entities = JsonConvert.DeserializeObject<List<dynamic>>(saveBundle.SelectToken("entities").ToString());

        foreach (var entity in entities)
        { 
            JObject objEntityAspect = entity["entityAspect"];
            JToken objEntityState = objEntityAspect["entityState"];

            if (objEntityState.Value<string>() == "Modified")
            {
                // make a post with the instance id
            }

            entity.Remove("entityAspect");
        }

entity.Remove("entityAspect")是所需的关键组件。