是的,这只是清除缓存后的一两个初始浏览器加载。随后的刷新清除了问题。
我认为项目视图没有及时完全构建以在第一次加载时在集合视图中使用。但是他们正在刷新?不知道。
必须有一些关于代码序列或加载或加载时间本身的东西。没有把握。我正在通过 require.js 加载。
有两个集合 - 用户和消息。每个都在自己的集合视图中呈现。每个都有效,只是不是第一次或两次浏览器加载。
清除浏览器缓存后第一次加载控制台报告,例如:
“未捕获的 ReferenceError:未定义 MessageItemView”
一个简单的浏览器刷新就可以清除它。用户集合也是如此。它的集合视图表示它对其项目视图一无所知。但是一个简单的浏览器刷新,一切都很好。
我的视图(项目和集合)位于单独的文件中。那是问题吗?例如,这是我自己文件中的消息集合视图:
消息列表视图.js
var MessageListView = Marionette.CollectionView.extend({
itemView: MessageItemView,
el: $("#messages")
});
消息项视图位于单独的文件中:
消息视图.js
var MessageItemView = Marionette.ItemView.extend({
tagName: "div",
template: Handlebars.compile(
'<div>{{fromUserName}}:</div>' +
'<div>{{message}}</div>' +
)
});
然后在引用每个这些文件的主模块文件中,构建并显示集合视图:
main.js
//Define a model
MessageModel = Backbone.Model.extend();
//Make an instance of MessageItemView - code in separate file, messagelistview.js
MessageView = new MessageItemView();
//Define a message collection
var MessageCollection = Backbone.Collection.extend({
model: MessageModel
});
//Make an instance of MessageCollection
var collMessages = new MessageCollection();
//Make an instance of a MessageListView - code in separate file, messagelistview.js
var messageListView = new MessageListView({
collection: collMessages
});
App.messageListRegion.show(messageListView);
我只是把事情排序错了吗?我认为这是某种竞争条件,只是因为超过 3G 到 iPad 的项目视图总是未定义的。他们似乎从来没有及时建造。刷新一两次浏览器后,硬连线连接上的 PC 确实会成功。可能是加载时间还是浏览器的差异?PC 上的 Chrome IE 和 Firefox 似乎都表现出刷新行为的成功。iPad 上的 Safari 总是失败。
根据下面的评论,这是我的要求块:在文件 application.js 中
require.config({
paths: {
jquery: '../../jquery-1.10.1.min',
'jqueryui': '../../jquery-ui-1.10.3.min',
'jqueryuilayout': '../../jquery.layout.min-1.30.79',
underscore: '../../underscore',
backbone: '../../backbone',
marionette: '../../backbone.marionette',
handlebars: '../../handlebars',
"signalr": "../../jquery.signalR-1.1.3",
"signalr.hubs": "/xyvidpro/signalr/hubs?",
"debug": '../../debug',
"themeswitchertool": '../../themeswitchertool'
},
shim: {
'jqueryui': {
deps: ['jquery']
},
'jqueryuilayout': {
deps: ['jquery', 'jqueryui']
},
underscore: {
exports: '_'
},
backbone: {
deps: ["underscore", "jquery"],
exports: "Backbone"
},
marionette: {
deps: ["backbone"],
exports: "Marionette"
},
"signalr": {
deps: ["jquery"],
exports: "SignalR"
},
"signalr.hubs": {
deps: ["signalr"],
exports: "SignalRHubs"
},
"debug": {
deps: ["jquery"]
},
"themeswitchertool": {
deps: ["jquery"]
}
}
});
require(["marionette", "jqueryui", "jqueryuilayout", "handlebars", "signalr.hubs", "debug", "themeswitchertool"], function (Marionette) {
window.App = new Marionette.Application();
//...more code
})
最后,在使用创建相关集合视图的模块内部,外部文件依赖项列表如下:
var dependencies = [
"modules/chat/views/userview",
"modules/chat/views/userlistview",
"modules/chat/views/messageview",
"modules/chat/views/messagelistview"
];
显然 itemViews 列在 collectionViews 之前。这对我来说似乎是正确的。不确定在定义之前需要 itemViews 的 collectionViews 的原因。为什么浏览器刷新后一切正常?