http://www.breezejs.com/documentation/extending-entitiesに記載されている例と、「マップされていないプロパティをサーバー クラスの計算プロパティで設定できる」というラベルの付いた DocCode テストに従いました。
マップされていないプロパティにアクセスしようとすると、コンストラクターで設定されたときと同じ値になります。サーバーがマップされていないプロパティを返していることを確認しました。angularjs を Breezejs で使用する場合、マップされていないプロパティにアクセスする適切な方法がわからない可能性があります。
「空の文字列、値が期待されます」とコメントした2行については、以下を参照してください。
breeze.NamingConvention.camelCase.setAsDefault();
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
var ms = new breeze.MetadataStore();
var manager = new breeze.EntityManager({
serviceName: 'breeze/Projects',
metadataStore: ms
});
manager.enableSaveQueuing(true);
manager.fetchMetadata()
.then(function () {
var Sheet = function ()
{
this.previewUrl = "";
}
ms.registerEntityTypeCtor("Sheet", Sheet);
var query = new breeze.EntityQuery("Project")
.withParameters({ id: $stateParams.projectId });
manager
.executeQuery(query)
.then(function (data)
{
var p = data.results[0]; // project
var s = p.sheets[0];
console.log(s["previewUrl"]); // empty string, value expected
console.log(s.previewUrl); // empty string, value expected
})
.fail(function (e)
{
console.log(e.message);
alert(e);
});
});
編集:追加情報 キャメルケースの命名規則が原因であることがわかりました。getPropertyFromServerRaw 関数を次のように変更することで、breeze.js のバグを修正できました。
function getPropertyFromServerRaw(rawEntity, dp) {
return rawEntity[dp.nameOnServer || dp.isUnmapped && rawEntity.entityType.metadataStore.namingConvention.clientPropertyNameToServer(dp.name)];
}
願わくば、この修正が Breeze.js の次のバージョンに反映されることを願っています。