jScrollPane不能与meteor.js一起工作

jScrollPane not working with meteor.js

本文关键字:一起 工作 js meteor 不能 jScrollPane      更新时间:2023-09-26

我试图使用jScrollPane与meteor.js,但它的行为不像预期的那样。首先,如果我给出。滚动窗格'类的一个div,它将工作没有被我显式初始化。但是当我尝试显式初始化它时,它不起作用。这是流星魔法吗?或者我遗漏了一些明显的东西。

第二,如果我没有初始化它,但我试图访问它…它的数据是空的,所以我不能在它上面使用api。我在下面包含了一些示例代码,如果我做错了什么,请让我知道。

...
    <div class="rectangle">
      <div class="chat scroll-pane" id="chatWindow">
      {{#each Messages}}
      {{#if Compare uId UID}}
      <div class="bubble me">{{Text}}</div>
      {{else}}
      <div class="bubble you">{{Text}}</div>
      {{/if}}
      {{/each}} 
      </div>

      <input class="textinput" type="text" placeholder="Insert Message" id="textToSubmit">
      <button class="btn btn-success" id="submit" autofocus="autofocus">Send
        <br>
        <br>
      </button>
    </div>

js

    if (Meteor.isClient) {
    ...
    var Message = new Meteor.Collection("Message");
    Template.Message.rendered = function(){
      if(!this._rendered) {
        this._rendered = true;
        var scroll = $(this.find("#chatWindow"));
        var api = scroll.data('jsp');
        console.log(api);
      }
   };
   ...
    }

如果您需要更多信息,请告诉我。

谢谢

这里有两件事:

(1)您需要将反应性连接到模板,以确保传入Messages的时间是正确的。这可以通过使用Session变量来设置加载,并通过将Template.scroll.Messages设置为返回集合游标的函数来实现。通常,如果您的Template.scroll.Messages返回一个使用Session对象(即roomId)的查询,则不需要以这种方式设置会话。如果是这种情况,您可以放弃对Meteor.subscribe调用和"加载"的Session的回调。

(2)你会想要关闭autopublish(流星移除自动发布)并显式订阅数据,这样你就知道什么时候你的集合加载;

(3)你必须在isClient块之外声明你的消息Collection,以确保服务器知道它。

HTML:

<template name="scroll">
    <div class="rectangle">
        <div style="height:100px;overflow:auto;" id="chatWindow">
            {{#each Messages}}
                {{#if isMe this}}
                    <div class="bubble me">{{text}}</div>
                {{else}}
                    <div class="bubble you">{{text}}</div>
                {{/if}}
            {{/each}} 
        </div>
    </div>
</template>

JS:

Messages = new Meteor.Collection("messages");
if (Meteor.isClient) {
    Meteor.subscribe("messages", function () {
        Session.set("loaded", true);
    });
    Template.scroll.rendered = function () {
        if (Session.get("loaded")) {
            $(this.find("#chatWindow")).jScrollPane();
            var api = $(this.find("#chatWindow")).data("jsp");
            ...
        }
    };
    Template.scroll.helpers({
        isMe: function (msg) {
            return msg.userName === 'me';
        }
    });
    Template.scroll.Messages = function () {
        return Messages.find({});
    };
}
if (Meteor.isServer) {
        Meteor.startup(function () {
        if (Messages.find().count() === 0) {
            Messages.insert({ text: 'Message 1', userName: 'me' });
            Messages.insert({ text: 'Message 2', userName: 'you' });
            Messages.insert({ text: 'Message 3', userName: 'me' });
        }
    });
    Meteor.publish("messages", function () { return Messages.find({}); });
}