2

我正在使用 sage cell 将 html 转换为数学内容

Template.home.rendered = function(){
  \\ apply sagecell and mathjax
}

但是,渲染的内容来自 mongo,因此有时会在应用 sage cell 后加载。我可以做这样的事情

Template.home.rendered = function(){
  Deps.autorun(function(){
    if (Content.findOne({_id: ...})){
      \\ apply sagecell and mathjax
    }
  });
}

它更好,但仍然不能一直工作。还有其他东西可以用来检测内容是否完全呈现?

4

2 回答 2

1

剧本

<script type='text/javascript' src="http://sagecell.sagemath.org/static/embedded_sagecell.js"></script>

应该在头部需要删除,而是在内容完全加载后加载,如下所示:

Template.content.rendered = function(){
  // sage
  Deps.autorun(function(){
    if (Session.get('contentChanged')){
      // loading this script causes mathjax to run
      $.getScript("http://sagecell.sagemath.org/static/embedded_sagecell.js", function(d, textStatus){
        if (textStatus=='success'){
          // this converts <div class='compute'> to a sage cell
          sagecell.makeSagecell({
            inputLocation: 'div.compute',
            evalButtonText: 'Evaluate',
            hide: ['editorToggle']
          });
        }
      })
    }
  })

如果我从 1 个内容模板转到另一个内容模板,似乎没有重新渲染任何内容,因此未应用 mathjax。我能想到的唯一解决方法是强制重新加载页面:

Template.content.events({
'click a': function(evt){
  evt.preventDefault();
  location.href = evt.currentTarget.href;
}
})

不幸的是,这使网站速度变慢了。

于 2013-08-31T07:34:57.497 回答
1

编辑了新的回复:

<template name='pendingAnswer'>
    The answer to your question, coming back whenever, is:
    {{>answer}}
</template>

<template name='answer'>
    {{fromSage}}
</template>     

Template.answer.helpers({ 
    fromSage: function () {  
        Session.get('fromSage');
    }
});

Invoked whenever - from a button, from navigating to the page, on blur...        
function GetAnswerFromSage(data) {
        callHTTP(website,data, callbackFromSage)
}        

function callbackFromSage(err, data) {
        if (err) then log(err);
        Session.set('fromSage', data);
        }

较早:在检索 mongo 时尝试转换: 来自 Meteor Doc

// An Animal class that takes a document in its constructor
Animal = function (doc) {
  _.extend(this, doc);
};
_.extend(Animal.prototype, {
  makeNoise: function () {
    console.log(this.sound);
  }
});

// Define a Collection that uses Animal as its document
Animals = new Meteor.Collection("Animals", {
  transform: function (doc) { return new Animal(doc); }
});

// Create an Animal and call its makeNoise method
Animals.insert({name: "raptor", sound: "roar"});
Animals.findOne({name: "raptor"}).makeNoise(); // prints "roar"
于 2013-08-29T19:49:59.867 回答