我正在使用ODataController将数据返回到breeze dataservice,这是dataservice
app.dataservice = (function (breeze) {
breeze.config.initializeAdapterInstances({ dataService: "OData" });
var manager = new breeze.EntityManager('/api/v1/');
return {
getRecipePage: getRecipePage
};
function getRecipePage(skip, take, searchText) {
var query = breeze.EntityQuery
.from("Recipes")
.orderBy("Name")
.skip(skip).take(take)
.inlineCount(true);
if (searchText) {
query = query.where("Name", "contains", searchText);
}
return manager.executeQuery(query);
}
})(breeze);
在我的控制器中调用getRecipePage函数时,它似乎正确地返回数据,但异常是奇怪的
getDataFunction(skip, take)
.then(function (largeLoad) {
$scope.setPagedData(largeLoad, currentPage, pageSize);
})
.fail(function (e) {
debugger;
});
e变量的消息为"; "
,这没有任何意义。状态为“200 OK”,这很好。
正文包含我的两个实体,并且网址代码更正“/ api / v1 / Recipes?$ orderby = Name&amp; $ top = 2&amp; $ inlinecount = allpages”,如果我导航到它,json看起来很好:< / p>
{
"$id": "1",
"$type": "Breeze.WebApi2.QueryResult, Breeze.WebApi2",
"Results": [
{
"$id": "2",
"$type": "RecipeBook.Web.Angular.Models.RecipeBook.Recipe, RecipeBook.Web.Angular",
"Name": "1 Boiled Water",
"Description": "6 Steamy goodness!",
"Id": 1
},
{
"$id": "3",
"$type": "RecipeBook.Web.Angular.Models.RecipeBook.Recipe, RecipeBook.Web.Angular",
"Name": "2 Hot Chocolate",
"Description": "5 Chocolatey Chocolateness!",
"Id": 2
}
],
"InlineCount": 6
}
......这个错误是什么?最后,这是堆栈:
Error
at createError (http://localhost:62576/Scripts/breeze.debug.js:15182:22)
at http://localhost:62576/Scripts/breeze.debug.js:14971:40
at http://localhost:62576/Scripts/datajs-1.1.1.js:1671:17
at XMLHttpRequest.odata.defaultHttpClient.request.xhr.onreadystatechange (http://localhost:62576/Scripts/datajs-1.1.1.js:2587:25)
关于发生了什么的想法???
修改 经过大量的挖掘,我有点缩小了与读取响应的处理程序相关的问题。在datajs-1.1.1.js~line 8100中,有一个dispatchHandler函数。我有一个从OData调用回来的requestOrResponse:
它有一个带有上述json文本的body属性。但是,数据属性是未定义的,但我认为它正在尝试将主体转换为...并且正在寻找处理程序来执行此操作。它的statusCode是200,statusText是OK。但是该方法找不到合适的处理程序并抛出:
throw { message: "no handler for data" };
......这似乎是错误的起源。我不知道什么设置不正确,以便我可以纠正这种情况。
EDIT2: 它可能实际上是因为没有正确解析元数据(xml)...,这就是它的样子(在调试时取自datajs handlerRead函数)
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<Schema Namespace="RecipeBook.Web.Angular.Models.Recipe" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="Recipe">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" />
<Property Name="Description" Type="Edm.String" />
<Property Name="Steps" Type="Collection(Edm.String)" />
<NavigationProperty Name="Ingredients" Relationship="RecipeBook.Web.Angular.Models.Recipe.RecipeBook_Web_Angular_Models_Recipe_Recipe_Ingredients_RecipeBook_Web_Angular_Models_Recipe_RecipeIngredient_IngredientsPartner" ToRole="Ingredients" FromRole="IngredientsPartner" />
</EntityType>
<EntityType Name="RecipeIngredient">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<Property Name="IngredientId" Type="Edm.Int32" Nullable="false" />
<Property Name="Quantity" Type="Edm.Int32" Nullable="false" />
<Property Name="UnitOfMeasureId" Type="Edm.Int32" Nullable="false" />
<Property Name="Notes" Type="Edm.String" />
</EntityType>
<Association Name="RecipeBook_Web_Angular_Models_Recipe_Recipe_Ingredients_RecipeBook_Web_Angular_Models_Recipe_RecipeIngredient_IngredientsPartner">
<End Type="RecipeBook.Web.Angular.Models.Recipe.RecipeIngredient" Role="Ingredients" Multiplicity="*" />
<End Type="RecipeBook.Web.Angular.Models.Recipe.Recipe" Role="IngredientsPartner" Multiplicity="0..1" />
</Association>
<EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
<EntitySet Name="Recipes" EntityType="RecipeBook.Web.Angular.Models.Recipe.Recipe" />
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
EDIT3:
...所以,如果我使用OData,作为我的dataService,我需要在$ metadata找到json元数据。如果我使用WebAPI,它会在/ Metadata中查找元数据,这可以是Edmx或json。但是,我的元数据在$ metadata中以Edmx的形式返回...这是不支持的一件事吗?
http://www.breezejs.com/documentation/breeze-metadata-details
我准备抛弃所有这些(棱角分明,微风,odata),然后按照旧方式去做。
Edit4: 这不是一个修复,但如果我关闭元数据它“工作”...所以我的问题肯定与元数据无法正确加载有关。
var dataService = new breeze.DataService({
serviceName: "/api/v1/",
hasServerMetadata: false
});
答案 0 :(得分:1)
看起来您正在使用Web API。考虑您可以使用[BreezeController]
属性修饰控制器,而不是指定OData
,您可以使用webApi
来扩展配置。值得一试。
此外,您可能需要配置Breeze适配器以使用与Angular配对良好的backingStore。 - http://www.breezejs.com/samples/todo-dataservice(此链接提供了一些有用的提示,可指导您设置Breeze以便与Angular配合使用)
最后,请记住,第一次使用它时设置任何库似乎总是比实际更困难。一旦你配置它,你几乎再也不会触摸配置,而是Breeze 只是工作,真的很棒。
修改强>
检查此链接,该链接在Breeze,Angular,OData和Web API上进行了简要的漫游 - http://sravi-kiran.blogspot.com/2013/11/UsingBreezeJsToConsumeAspNetWebApiODataInAnAngularJsApplication.html
另一个好处'我怎么......'在这里回答沃德 -