当尝试使用微风保存更改时,AngularJS会抛出异常

时间:2015-02-13 12:49:34

标签: javascript angularjs breeze

我是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
        });
    }

在datacontext中:

 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);

2 个答案:

答案 0 :(得分:3)

两个问题:

  1. 您的datacontext方法未返回承诺,因此调用方无法找到任何内容来挂起thenfail

  2. 您应该致电catch,而不是fail

  3. 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语句会返回一个承诺。

    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。使用 catch

    我假设您已将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”是一个替代的诺言库 - 一个由Breeze / KnockOut应用程序使用,它是Angular $q的基础。

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

    很抱歉这个混乱。

答案 1 :(得分:0)

更新savesetting功能,如下所示,返回Promise

function saveSettings() {
    if (manager.hasChanges()) {
       return manager.saveChanges(); // return promise

    } else {
        log("Nothing to save");
        return false;
    };
}

然后你可以调用然后更新函数失败,如下所示。

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
    });
}