【问题标题】:AngularJS throws exception when trying to saveChanges with breezeAngularJS 在尝试用微风保存更改时抛出异常
【发布时间】:2015-02-16 04:09:58
【问题描述】:

我是 AngularJS 和 Breeze 的新手。我正在尝试保存更改并遇到问题。这是我的代码:

在控制器中:

function update() {
        vm.loading = true;
        return datacontext.saveSettings().then(function () {
            vm.loading = false; // never gets called
        }).fail(function (data) {
            vm.loading = false; // never gets called
        });
    }

在数据上下文中:

 function saveSettings() {
        if (manager.hasChanges()) {
            manager.saveChanges() // breaks here if there are changes
                .then(saveSucceeded)
                .fail(saveFailed)
                .catch(saveFailed);
        } else {
            log("Nothing to save");
            return false;
        };
    }

错误是在angular.js 中抛出的,它非常无用TypeError: undefined is not a function 我想我在这里遗漏了一些简单的东西,但无法弄清楚它是什么。

要注意它确实向服务器上的 SaveChanges 方法发送了正确的数据,但是在收到来自服务器的任何响应之前就抛出了错误。收到响应后,它会引发另一个错误TypeError: Cannot read property 'map' of undefined,但这可能与我返回的响应无效有关。我还没到那部分。

有人可以帮忙吗?我迷路了。

更新

这是我构建数据服务和管理器的方式:

var serviceName = "http://admin.localhost:33333/api/breeze/"; // 
var ds = new breeze.DataService({
    serviceName: serviceName,
    hasServerMetadata: false,
    useJsonp: true,
    jsonResultsAdapter: jsonResultsAdapter
});
var manager = new breeze.EntityManager({ dataService: ds });
model.initialize(manager.metadataStore);

【问题讨论】:

  • @Kiee 不确定你的意思是什么?我尝试遵循 Hot Towel 应用程序示例并构建与此类似的数据上下文。所有获取数据方法都可以正常工作,因此数据上下文可以正常工作,我更新了问题以包括我创建管理器的方式。
  • 我不太确定,但如果datacontext.saveSettings() 在更新函数中没有返回承诺,你就不能使用then 函数。
  • @JenishRabadiya 代码取自这里 getbreezenow.com/documentation/save-changes ,知道如何返回承诺以及它应该包含什么吗?
  • 嗨,你获取元数据了吗????
  • @parthicool05 不,我没有服务器元数据,因为我没有使用实体框架。我在客户端上手动构建了我的模型,我怀疑问题可能存在,尽管正如我之前所说,获取数据和绑定工作正常。

标签: javascript angularjs breeze


【解决方案1】:

两个问题:

  1. 您的 datacontext 方法没有返回承诺,因此调用者找不到任何东西可以挂起 thenfail 调用。

  2. 你应该打电话给catch,而不是fail

1。返回一个承诺

您的saveSettings 方法在成功的情况下没有返回结果,所以它一定会失败。你的方法还必须在失败的情况下返回一个承诺......否则它也会失败。

当我在这里时,由于您的成功和失败案例之间没有真正的区别,您不妨将vm.loading 切换到finally 子句。

试试这个:

function update() {
    vm.loading = true;
    return datacontext.saveSettings()
        .then(function () {
            // .. success handling if you have any
        })
        .catch(function (data) {
            // .. fail handling if you have any
        })
        .finally(funtion() {
            vm.loading = false; // turn it off regardless
        });
}

现在dataContext ...注意两个return 语句返回一个promise。

function saveSettings() {
    if (manager.hasChanges()) {
        return manager.saveChanges() 
            .then(saveSucceeded)
            .catch(saveFailed);
    } else {
        log("Nothing to save");
        // WHY ARE YOU FAILING WHEN THERE IS NOTHING TO SAVE? 
        // Breeze will handle this gracefully without your help
        return breeze.Q.reject(new Error('Nothing to save'));
    };
}

2。使用捕捉

我假设您已将 Breeze 配置为使用 Angular 的 $q 进行承诺(您应该使用“breeze.angular”服务并在某处注入“breeze”)。

$q does not have a fail method!相当于catch。出于某种原因,您都已附加到您的查询中。在服务器有机会响应之前,您将立即收到 ReferenceError 异常……尽管它会启动请求并且您也会收到来自服务器的回调。

试试吧:

return manager.saveChanges() 
    .then(saveSucceeded)
    .catch(saveFailed);

您会看到许多调用 failfin 的 Breeze 示例。这些是“Q.js”方法; “Q.js”是一个替代的 promise 库 - 被 Breeze/KnockOut 应用程序使用,它是 Angular 的 $q 的基础。

“Q.js”和$q 都支持现在标准的catchfinally 承诺方法。我们正在慢慢地将我们的示例代码迁移到这个标准。在不同的地方有很多旧的fail/finally 代码。这需要时间。

很抱歉给您带来了困惑。

【讨论】:

    【解决方案2】:

    如下更新savesetting函数以返回Promise

    function saveSettings() {
        if (manager.hasChanges()) {
           return manager.saveChanges(); // return promise
    
        } else {
            log("Nothing to save");
            return false;
        };
    }
    

    然后您可以调用 then 并在更新功能中失败,如下所示。

    function update() {
        vm.loading = true;
        return datacontext.saveSettings().then(function () {
            vm.loading = false; // never gets called
        }).fail(function (data) {
            vm.loading = false; // never gets called
        });
    }
    

    【讨论】:

    • 查看我对 catchfail 的评论
    猜你喜欢
    • 2013-09-14
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    相关资源
    最近更新 更多