Tôi có một ứng dụng SPA (durandaljs) và tôi có một tuyến đường cụ thể nơi tôi lập bản đồ "id" của thực thể mà tôi muốn tìm nạp.Breezejs EntityManager MetadataStore và fetchEntityByKey
Mẫu là "/ #/todoDetail /: id".
Ví dụ: "/ #/todoDetail/232" hoặc "/ #/todoDetail/19".
Bật chức năng kích hoạt của chế độ xem, tôi nhận thông tin tuyến đường để tôi có thể lấy id. Sau đó, tôi tạo một thể hiện mới của breezejs EntityManager để lấy thực thể với id đã cho.
Vấn đề là khi tôi gọi manager.fetchEntityByKey ("Todos", id), EntityManager chưa có siêu dữ liệu từ máy chủ, do đó, nó ném ngoại lệ "Không thể định vị 'Loại' theo tên: Todos ".
Nó chỉ hoạt động nếu trước tiên tôi thực hiện truy vấn đối với cửa hàng (manager.executeQuery), trước khi gọi hàm fetchEntityByKey.
Đây có phải là hành vi dự kiến hoặc lỗi không? Có cách nào để tự động fecth siêu dữ liệu trong instantiation EntityManager?
lưu ý: Tôi tin rằng thật khó để sử dụng EntityManager được chia sẻ trong trường hợp của tôi, vì tôi muốn cho phép người dùng trực tiếp nhập tuyến đường trên trình duyệt.
EDIT: Là một workaround tạm thời, tôi đang làm điều này:
BreezeService.prototype.get = function (id, callback) {
var self = this;
function queryFailed(error) {
app.showMessage(error.message);
callback({});
}
/* first checking if metadatastore was already loaded */
if (self.manager.metadataStore.isEmpty()) {
return self.manager.fetchMetadata()
.then(function (rawMetadata) {
return executeQuery();
}).fail(queryFailed);
} else {
return executeQuery();
}
/* Now I can fetch */
function executeQuery() {
return self.manager.fetchEntityByKey(self.entityType, id, true)
.then(callback)
.fail(queryFailed);
}
};
sugestion tốt, vì vậy tôi sẽ tạo entityManagers với các nhà máy, chia sẻ siêu dữ liệu toàn cầu giữa chúng. Nhân tiện, liệu có cơ hội nào để cải thiện làn gió để thêm cơ sở này, giống như một trường hợp toàn cầu của metadatastore? Hoặc sau đó buộc thực thể truy vấn siêu dữ liệu ngay cả khi tôi chỉ muốn fetchEntityByKey, mà không cần chạy truy vấn đầy đủ đối với dịch vụ? –
Không chắc chắn ý bạn là gì. Tôi không quan tâm đến MetadataStore mặc định của Breeze nhưng đó là thứ bạn có thể dễ dàng tạo cho chính mình. Bạn có thể yêu cầu một MetadataStore để fetchMetadata (đó là không đồng bộ của khóa học) khá ngoài một truy vấn (tôi đã đề cập đến điều này trong câu trả lời của tôi). Bạn cũng có thể nhìn vào 'EntityManager.createEmptyCopy'. Bạn có thể gọi nó trên EM chủ của bạn để tạo các EM trống mới được cấu hình đầy đủ; phần còn lại của phương thức factory sẽ nhập từ master chỉ những thực thể đó (ví dụ: danh sách tham chiếu) mà bạn muốn trong bản sao. – Ward