我是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);
答案 0 :(得分:3)
两个问题:
您的datacontext
方法未返回承诺,因此调用方无法找到任何内容来挂起then
或fail
。
您应该致电catch
,而不是fail
您的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'));
};
}
我假设您已将Breeze配置为使用Angular的$q
进行承诺(您应该使用“breeze.angular”服务并在某处注入“breeze”)。
$q
does not have a fail
method!等价物是catch
。出于某种原因,您同时附加了您的查询。在服务器有机会响应之前,您将立即获得ReferenceError
异常...虽然它将启动请求,但您也将从服务器获得回调。
尝试:
return manager.saveChanges()
.then(saveSucceeded)
.catch(saveFailed);
您会看到许多调用fail
和fin
的Breeze示例。这些是“Q.js”方法; “Q.js”是一个替代的诺言库 - 一个由Breeze / KnockOut应用程序使用,它是Angular $q
的基础。
“Q.js”和$q
都支持现在标准的catch
和finally
承诺方法。我们正在慢慢地将示例代码迁移到此标准。在不同的场地中有很多旧的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
});
}