// Template.post_edit.preserve(['#title', '#url', '#editor', '#sticky']); // Template.post_edit.preserve({ // // 'input[id]': function (node) { return node.id; } // '[name]': function(node) { return node.getAttribute('name');} // }); Template.post_edit.helpers({ post: function(){ // The idea here is to isolate the call to findOne() so that it stops // being reactive once data is found. The reason being that server scoring // updates will 'change' the post, and meteor will overwrite the user's // input, even if preserve is set. // Kind of like {{#constant}}, except it waits for data. // // XXX: either figure out a different approach, or factor this out and // use everywhere. var outerContext = Meteor.deps.Context.current; var innerContext = new Meteor.deps.Context; var post; innerContext.onInvalidate(function() { // we don't need to send the invalidate through anymore if post is set post || outerContext.invalidate(); }); innerContext.run(function() { post = Posts.findOne(Session.get('selectedPostId')); }); return post; }, categories: function(){ return Categories.find(); }, isChecked: function(){ var post= Posts.findOne(Session.get('selectedPostId')); return $.inArray( this.name, post.categories) != -1; }, submittedDate: function(){ return moment(this.submitted).format("MMMM Do, h:mm:ss a"); } }); Template.post_edit.rendered = function(){ var post= Posts.findOne(Session.get('selectedPostId')); if(post && !this.editor){ this.editor= new EpicEditor(EpicEditorOptions).load(); this.editor.importFile('editor',post.body); $('#submitted').datepicker().on('changeDate', function(ev){ $('#submitted_hidden').val(moment(ev.date).valueOf()); }); } } Template.post_edit.events = { 'click input[type=submit]': function(e, instance){ e.preventDefault(); if(!Meteor.user()){ throwError('You must be logged in.'); return false; } var selectedPostId=Session.get('selectedPostId'); var title= $('#title').val(); var url = $('#url').val(); var submitted = $('#submitted_hidden').val(); var body = instance.editor.exportFile(); var sticky=!!$('#sticky').attr('checked'); var categories=[]; $('input[name=category]:checked').each(function() { categories.push($(this).val()); }); console.log('categories:', categories); Posts.update(selectedPostId, { $set: { headline: title , url: url , submitted: parseInt(submitted) , body: body , sticky: sticky , categories: categories } } ,function(error){ if(error){ throwError(error.reason); }else{ trackEvent("edit post", {'postId': selectedPostId}); Router.navigate("posts/"+selectedPostId, {trigger:true}); } } ); } , 'click .delete-link': function(e){ e.preventDefault(); if(confirm("Are you sure?")){ var selectedPostId=Session.get('selectedPostId'); Posts.remove(selectedPostId); Router.navigate("posts/deleted", {trigger:true}); } } };