首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流星- Ckeditor积分

流星- Ckeditor积分
EN

Stack Overflow用户
提问于 2015-03-04 03:50:57
回答 3查看 835关注 0票数 3

我不确定Meteor加载条目的方式是否发生了变化,或者它处理jquery的方式发生了变化,但是我在让ckeditor出现时遇到了很大的困难。

主要模板(铁-路由器):

代码语言:javascript
复制
<template name="layout">
<head>
    <script type="text/javascript" src="js/ckeditor/ckeditor.js"></script>
    <script type="text/javascript" src="js/ckeditor/adapters/jquery.js"></script>
</head>
.....
</template>

独立编辑模板:

代码语言:javascript
复制
<template name="editor">
    <div class="editor_container">
        <textarea class="editor"></textarea>
    </div>
</template>

位于public/js/ckeditor的Ckeditor,每当我尝试执行Template.editor.rendered()技术,甚至尝试在控制台中键入$('.editor').ckeditor();时,我都会得到以下错误:

代码语言:javascript
复制
$('.editor').ckeditor();
VM48825:2 Uncaught TypeError: undefined is not a function

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-04 03:59:08

尝试将<head>部分从布局模板中删除。在这里阅读,我相信<head>部分被专门处理为流星(参见:http://docs.meteor.com/#/full/structuringyourapp),它在模板中可能导致JS实际上没有被加载。不过,只是猜测一下。

代码语言:javascript
复制
<head>
    <script type="text/javascript" src="js/ckeditor/ckeditor.js"></script>
    <script type="text/javascript" src="js/ckeditor/adapters/jquery.js"></script>
</head>
<template name="layout">
.....
</template>
票数 3
EN

Stack Overflow用户

发布于 2015-03-04 04:16:33

您可以像这样将IRLibLoaderiron:router使用到onBeforeAction中。

代码语言:javascript
复制
Router.route('/editor', {
  name: 'editor',
  template: 'layout',
  onBeforeAction: function () {
    var ckEditor = IRLibLoader.load('/js/ckeditor/ckeditor.js');
    var adapter = IRLibLoader.load('/js/ckeditor/adapters/jquery.js');
    if(ckEditor.ready() && adapter.ready()){
      console.log('The 2 JS just finish load');
      this.next(); // Render the editor page

      if(Meteor.isClient){
        Template.editor.rendered = function(){
          $('.editor').ckeditor();
          console.log("loading coeditor when template fully rendered");
        }
      }
    }
  }
});

在主layout上可以使用此选项。

代码语言:javascript
复制
<head>
    <script type="text/javascript" src="js/ckeditor/ckeditor.js"></script>
    <script type="text/javascript" src="js/ckeditor/adapters/jquery.js"></script>
</head>
<template name="layout">
 {{> yield}}
</template>

<template name="editor">
    <div class="editor_container">
        <textarea class="editor"></textarea>
    </div>
</template>

并执行相同的呈现函数

代码语言:javascript
复制
Template.editor.rendered = function(){
   $('.editor').ckeditor();

   //or make a little delay (1sec) 
   Meteor.setTiemout(function(){
    $('.editor').ckeditor();
   },100)
 }
票数 2
EN

Stack Overflow用户

发布于 2015-03-04 04:04:54

您的代码有几个问题:

  • 不能将<head>部分放入另一个模板中,必须在所有模板之外执行。
  • JS文件的路径被破坏了,您必须在它们前面加上一个斜杠,以引用公共目录中的文件。
  • <head>部分加载脚本不是一个好主意,因为当应用程序首次为每个用户加载脚本时,它们将被加载,即使它们从未使用编辑器。

这里有一个解决方案,在呈现编辑器模板时,我们使用jQuery承诺异步加载每个脚本,然后才初始化CKEditor。

代码语言:javascript
复制
Template.editor.rendered=function(){
  var template=this;
  $.when(
    $.getScript("/js/ckeditor/ckeditor.js"),
    $.getScript("/js/ckeditor/adapters/jquery.js")
  ).done(function(){
    template.$(".editor").ckeditor();
  });
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28846373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档