2015-10-01 22 views
6

Trong ứng dụng ember của chúng tôi, chúng tôi đang sử dụng các phiên bản sau của dữ liệu ember và dữ liệu ember-factory-factory-guy.findRecord cho lỗi "Không thể đọc thuộc tính '_internalModel' không xác định"

package.json

"ember-cli": "^1.13.8", 
"ember-data": "1.13.9", 
"ember-data-factory-guy": "1.13.10", 

Lưu ý: chúng tôi đang sử dụng hoạt động mô hình bộ chuyển đổi, chưa di cư đến adapter json-api.

import ActiveModelAdapter from 'active-model-adapter'; 
export default ActiveModelAdapter.extend({ 

Route: item.js

export default Ember.Route.extend(({ 
    model(params) { 
    return this.store.findRecord('item', params.item_id); 
    } 
}); 

làm việc tốt trong chế độ phát triển, nhưng khi chạy trường hợp thử nghiệm, đang phải đối mặt với vấn đề sau đây:

Test Case cho "màn hình đơn mục "không thành công với lỗi sau:

{ 
    "message": "Cannot read property '_internalModel' of undefined", 
    "name": "TypeError" 
} 

ember dữ liệu/lib/system/stpre/finder.js, thất bại tại return tuyên bố

trở promise.then (function (adapterPayload) { Ember.assert ("Bạn đã yêu cầu cho một" + typeClass. typeClassKey + "với id" + id + ", nhưng phản hồi của bộ điều hợp không có bất kỳ dữ liệu nào", adapterPayload);

return store._adapterRun(function() { 
    var requestType = get(serializer, 'isNewSerializerAPI') ? 'findRecord' : 'find'; 
    var payload = normalizeResponseHelper(serializer, store, typeClass, adapterPayload, id, requestType); 
    //TODO Optimize 
    var record = pushPayload(store, payload); 
    return record._internalModel; 
}); 

(https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/store/finders.js#L32)

Có phải chúng ta thiếu bất cứ điều gì ở đây? Bất cứ ai có thể vui lòng giúp tôi giải quyết vấn đề này? Tôi đã thử bằng cách nâng cấp phiên bản lên phiên bản mới nhất nhưng vẫn gặp phải sự cố tương tự.

+1

Bạn đang stubbing phản ứng? 'this.store.findRecord ('item', params.item_id)' đưa ra một yêu cầu tới máy chủ. – vikram7

+0

Vâng, nó đang gửi yêu cầu đến máy chủ, nhưng tôi có dữ liệu đó trong kho lưu trữ dữ liệu ember của tôi, vì vậy tôi đã mong đợi để chọn nó từ đó. Do đó không có phản ứng đó. – Swati

+0

'this.store.findRecord' sẽ luôn gửi yêu cầu ngay cả khi bạn có yêu cầu trong cửa hàng của mình. Bạn nên thử 'peekRecord' nếu bạn không muốn gửi yêu cầu. – vikram7

Trả lời

0

Cuối cùng nhận được nguyên nhân chính xác:

Trong bộ chuyển đổi của tôi/application.js

// Ember Data 2.0 Reload behavior 
shouldReloadRecord: function() { return true; }, 
shouldReloadAll: function() { return true; }, 
shouldBackgroundReloadRecord: function() { return true; }, 
shouldBackgroundReloadAll: function() { return true; }, 

Những các dòng tôi đã thêm trong khi sửa các cảnh báo không dùng nữa và vì điều này, nó đã khiến cho các bản ghi được tải luôn, mặc dù y đã có mặt trong kho dữ liệu ember. Vì vậy, bây giờ tôi chỉ cần loại bỏ những người.

http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_new-adapter-hooks-for-better-caching tài liệu tham khảo này đã giúp tôi để có được nó hiểu rõ hơn nhiều :)

1

chủ yếu là tôi đăng bài này ở đây như là một lời nhắc nhở cho bản thân mình. Tôi chạy vào vấn đề này mỗi vài tuần và đến đây để tìm câu trả lời :)

Lỗi này đã được ném trong khi tôi đang chạy thử nghiệm chấp nhận vì tôi quên nói với ember-cli-ảo để tạo ra mô hình giả:

beforeEach(function() { 
    server.create('user', { id: window.sessionUser.id }); 
    server.create('project', { userId: window.sessionUser.id }); 
}); 
2

Trong trường hợp của tôi, sự cố là phản hồi của máy chủ không có phần tử gốc.

Server đã được trở về cho một người sử dụng:

{ 
    surname: 'surname', 
    name: 'name', 
    _id: 56ead1ace85b04be4a7e50e6 
} 

thay vì:

user: { 
    surname: 'surname', 
    name: 'name', 
    _id: 56ead1ace85b04be4a7e50e6 
} 
2

Nếu bạn đang truy vấn các máy chủ sử dụng findRecord(), Ember hy vọng đáp ứng được ở dạng

{singularModelName: {...}} 

Nếu bạn đang truy vấn máy chủ sử dụng query(), E mber hy vọng đáp ứng được ở dạng

{pluralModelName: [...]} 

Lỗi loại sẽ xảy ra nếu bạn không sau đó mô hình phản ứng khi sử dụng findRecord()

Các vấn đề liên quan