正如我在上一个线程中所解释的,我正在学习Meteor教程并学习制作日历应用程序。
编辑:纠正了一些错误,另外我为集合制作了一个名为calevents.js的单独文件,该文件位于集合文件夹中。
我可以添加事件,但弹出窗口不会显示,所以我不能给它们一个新名称。由于这种情况没有发生,新的活动也不会出现。为了查看事件,我必须手动刷新。编辑时:我可以重命名事件,但单击"保存"时不会更改。
这是我到目前为止的代码:
演示.js:
Session.setDefault('editingCalEvent', null);
Session.setDefault('showEditEvent', false);
Session.setDefault('lastMod', null);
Router.map(function () {
this.route('home', {
path: '/'
});
this.route('calendar', {
path: '/calendar'
});
});
Template.calendar.showEditEvent = function() {
return Session.get('showEditEvent');
}
Template.editevent.evt = function() {
var calEvent = CalEvents.findOne({_id:Session.get('editingCalEvent')});
return calEvent;
}
Template.editevent.events({
'click .save': function() {
console.log("update 123, ¿pasó por aquí?");
updateCalEvent(Session.get('editingCalEvent'), $("#title").val());
Session.set('editingCalEvent', null);
Session.set('showEditEvent',false);
Session.set('lastMod',new Date());
}
})
Template.calendar.rendered = function() {
$('#calendar').fullCalendar({
dayClick:function(date, allDay, jsEvent, view) {
//console.log("insertando...", date);
CalEvents.insert({title: 'New Event', start: date, end: date});
Session.set('lastMod',new Date());
},
eventClick:function(calEvent,jsEvent,view) {
Session.set('editingCalEvent', calEvent.id);
Session.set('showEditEvent', true);
},
eventDrop:function(calEvent) {
CalEvents.update(calEvent.id, {$set: {start:calEvent.start,end:calEvent.end}});
Session.set('lastMod',new Date());
},
events: function(start, end, callback) {
var events = [];
calEvents = CalEvents.find();
calEvents.forEach(function(evt) {
events.push({
id: evt._id,
title: evt.title,
start: evt.start,
end: evt.end
});
});
callback(events);
},
editable:true
});
}
Template.calendar.lastMod = function() {
return Session.get('lastMod');
}
var updateCalEvent = function(id, title) {
CalEvents.update(id, {$set: {title:title}});
return true;
}
calendar.html:
<template name="calendar">
{{#if showEditEvent}}
{{ >editevent}}
{{/if}}
<input type="hidden" name="lastMod" value="{{lastMod}}" id="lastMod">
<div id="calendar">
</div>
</template>
<template name="editevent">
<div id="example" class="modal">
<div class="modal-header">
<a class="close" data-dismiss="modal">x</a>
<h3>Edit event</h3>
</div>
<div class="modal-body">
<label for="title">Event:</label>
<input type="text" name="title" id="title" value="{{evt.title}}">
</div>
<div class="modal-footer">
<a href="#" class="btn btn-success save">Save</a>
<a href="#" class="btn cancel" data-dismiss="modal">Cancel</a>
</div>
</div>
</template>
home.html:
<template name="home">
<div class="hero-unit">
<h1>Calendar app</h1>
<p>Manage your calendar</p>
</div>
</template>
演示.html:
<head>
<title>Calendar app</title>
</head>
<body>
{{>menu}}
<div class="container-fluid">
<div class="row-fluid">
{{renderPage}}
</div>
</div>
</body>
我也从教程中提供的网站下载了代码,并将其上传到我的Nitrous盒子中,但它也不起作用。起初我以为这是关于Nitrous的东西,但可能是关于Meteor版本的东西,不幸的是,我知道的不够多,无法找到问题所在。
关于fullcalendar的其他帖子并没有解决我的问题,但如果你认为它们解决了,请给我指明正确的方向。我也看过这个包的API,但我一无所知。有人有什么想法吗?
非常感谢。
确保添加的事件与相应的模板相对应。
例如:
Template.calendar.events({
'click .css-class-name': function(){
//do something on click
console.log("click event fired");
},
});
这将在单击任何具有class="css类名"的HTML元素时触发事件,但仅适用于日历模板中的元素。
如果你试图在"editevent"模板中触发一个事件,那么你需要确保你做到了:
Template.editevent.events({
'click .css-class-name': function(){
//do something on click
console.log("click event fired");
},
});
希望这能有所帮助!
这里有一些事情可以让它启动并运行。首先,从未使用editevent
模板。您应该在HTML中的适当位置使用{{> editevent}}
标记来呈现它(我认为calendar
模板将是一个适当的位置)。
此外,您现在正在Template.calendar.rendered
函数中启动fullCalendar
程序包。太好了。但是,您还必须捕捉点击事件以更新事件。以下是他们在教程中的做法源代码:
Template.editEvent.events({
'click .save':function(evt,tmpl){
updateCalEvent(Session.get('editing_calevent'),tmpl.find('.title').value);
Session.set('editing_event',null);
Session.set('showEditEvent',false);
Session.set('lastMod',new Date());
}
})
上面的代码将捕获editEvents
模板中任何具有类save
的元素上的所有单击事件。
您还在模板中引用evt
,但这在JavaScript代码中没有定义。这是本教程中用于填充evt
的相应代码。
Template.editEvent.evt = function(){
var calEvent = CalEvents.findOne({_id:Session.get('editing_calevent')});
return calEvent
}
祝你好运!
您已经解决了这个问题吗?如果是,请告诉我们具体原因是什么?
我的猜测是,这与编辑事件几乎没有关系。我认为这与insert命令有关。在尝试重现您的案例时,我遇到了一个错误:"插入失败:找不到方法"。所以我猜你的插入不起作用。
可能,您只在客户端代码中声明了集合。因此,如果您添加一个server.js文件并添加到其中:
CalEvents = new Meteor.Collection('calevents');
然后,您的集合也将向服务器端声明,允许服务器处理它
致问候,
此外,问题可能是您正在尝试运行Bootstrap-2编码(这就是教程中的内容!),您已经(可能)在Meteor应用程序上安装了Bootstrap-3。
在这种情况下,EditEvent模板中的模式将不起作用,因为它的编码在Bootstrap-3中已经完全更改。
通过在控制台中操纵Bootstrap来检查您在应用程序中安装了什么版本的Bootstrap,然后运行:流星列表——使用
你可以通过各种方式消除问题的根源。如果在对话框上方的模板EditEvent中放置一个简单的文本,您可以在单击事件时看到它是否显示。你知道,问题出在模态上。
尝试更改
updateCalEvent(Session.get('editingCalEvent'),$("#title").val())
收件人…
updateCalEvent(Session.get('editingCalEvent'),tmpl.find('#title').value);