AngularJS在尝试轻松保存Changes时抛出异常
AngularJS throws exception when trying to saveChanges with 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
});
}
在数据上下文中:
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);
两个问题:
-
您的
datacontext
方法不返回promise,因此调用者找不到任何东西来挂起then
或fail
调用。 -
您应该呼叫
catch
,而不是fail
1.回报承诺
您的saveSettings
方法在成功案例中没有返回结果,因此它一定失败了。在失败的情况下,您的方法还必须返回promise。。。否则它也会失败。
当我在这里的时候,由于成功和失败案例之间没有真正的区别,您不妨将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.使用catch
我假设您已经将Breeze配置为使用Angular的$q
进行promise(您应该使用"Breeze.Angular"服务,并在某个地方注入了"Breeze")。
$q
没有fail
方法!等效为catch
。出于某种原因,您已将两者都附加到查询中。在服务器有机会响应之前,您将立即得到ReferenceError
异常。。。尽管它会启动请求,您也会从服务器获得回调。
试试看:
return manager.saveChanges()
.then(saveSucceeded)
.catch(saveFailed);
您可以看到许多Breeze示例调用fail
和fin
。这些是"Q.js"方法;"Q.js"是Breeze/KnockOut应用程序使用的另一个promise库,它是Angular的$q
的基础。
"Q.js"和$q
都支持现在标准的catch
和finally
promise方法。我们正在慢慢地将示例代码迁移到这个标准。在不同的场地里有很多旧的fail
/finally
代码。这需要时间。
很抱歉造成混乱。
如下更新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
});
}
- 如何将getJson的响应保存在全局变量中
- 按下按钮时保存cookie
- 如何使用 Angular JS 将数据保存在数据库中
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- HTML5在画布中加载较小的图像并保存实际大小的图像
- 是否可以在浏览器中使用纯JavaScript保存音频流
- 如何将多个画布保存为一个图像
- PHP:显示sqlite数据库中的html格式数据,使用tinymce保存
- 如何将乳胶配方奶粉图像保存到Asp.net中的文件夹中
- 保存数组javascript
- 保存串行端口列表与流星
- 将JavaScript变量保存到Rails模型
- Java脚本将URL转换为已保存的URL时出错
- 如何自动保存动态生成的HTML SVG元素
- Javascript/jQuery压缩一个图像正确的评论帖子,并使用Ajax Laravel 5.2保存到控制器中
- 将JQuery Handontable保存到服务器上的excel文件中
- NodeJS expressJS使用multer和passport将文件上传并保存到MongoDB
- 将数据保存到数据库(ajax/php)后,使文本字段变灰/禁用
- 保存表中的行's在数组中的tbody,稍后使用它们
- AngularJS在尝试轻松保存Changes时抛出异常