【发布时间】:2015-04-18 14:40:32
【问题描述】:
我有一个 API 端点,它可以像这样输出简单的 JSON:
{
"num_results": 2,
"objects": [
{
"creator": null,
"id": 1,
"image": "www.test.com",
"title": "test",
"user_id": null
}
}
我想使用 Breeze 将其放入 Knockout observables。我收集到我需要一个自定义的jsonResultsAdapter。我试图跟随 Edmunds 的例子,但我承认我真的不明白。
var jsonResultsAdapter = new breeze.JsonResultsAdapter({
name: "test",
extractResults: function (data) {
var results = data.results;
if (!results) throw new Error("Unable to resolve 'results' property");
return results;
},
visitNode: function (node, parseContext, nodeContext) {
// Make parser
if (node.objects) {
return { entityType: "Pin" }
}
}
});
var dataService = new breeze.DataService( {
serviceName: "api/",
hasServerMetadata: false,
jsonResultsAdapter: jsonResultsAdapter,
});
var manager = new breeze.EntityManager( {
dataService: dataService
});
var query = new breeze.EntityQuery.from("pin");
manager.executeQuery(query).then(function(data){
ko.applyBindings(data);
}).fail(function(e) {
alert(e);
});
但这在 executeQuery 函数内部失败并显示一条消息:
错误:无法通过名称找到“类型”:“Pin”。请务必先执行查询或调用 fetchMetadata。
我以为我刚刚做到了。我在这里做错了什么?
编辑
function initialize(metadataStore) {
var DT = breeze.DataType; // alias
metadataStore.addEntityType({
shortName: "Pin",
namespace: "test",
dataProperties: {
creator: { dataType: DT.String },
id: { dataType: DT.Int64, isPartOfKey: true },
image: { dataType: DT.String },
title: { dataType: DT.String },
modelLinks: { dataType: DT.Int64 }
},
});
}
部分弄明白了。需要添加一个 metadataStore 来描述返回的数据类型。但现在我明白了
错误:您不能对同一个元素多次应用绑定。
【问题讨论】:
-
你的最后一个错误与Breeze无关,是Knockout.js的问题。
-
我意识到这一点,但我怀疑它与微风如何从导致问题的 JSON 创建对象有关。我开始相信微风不会给你带来任何东西,除非你有一个 odata 端点。这肯定不会让我在创建个人 ko 可观察对象时节省 LOC。实际上可能更多。
标签: knockout.js breeze