【问题标题】:jScrollPane not working with meteor.jsjScrollPane 不与meteor.js 一起使用
【发布时间】:2013-01-14 06:58:46
【问题描述】:

我正在尝试将 jScrollPane 与 meteor.js 一起使用,但它的行为与预期不符。首先,如果我将 '.scroll-pane' 类赋予一个 div,它会在没有被我明确初始化的情况下工作。但是当我尝试显式初始化它时,它不起作用。这是某种流星魔法吗?或者我遗漏了一些明显的东西。

其次,如果我不初始化它,但我尝试访问它......它的数据是空的,所以我不能使用它的api。我在下面包含了一些示例代码,如果我做错了什么,请告诉我。

html

...
    <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);
      }
   };

   ...
    }

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

谢谢

【问题讨论】:

    标签: javascript jquery jscrollpane meteor


    【解决方案1】:

    发生了一些事情:

    (1)您需要将反应性连接到您的模板,以确保传入Messages 的时间正确。这是通过使用Session 变量来设置负载,并将Template.scroll.Messages 设置为等于返回collection cursor 的函数来实现的。通常,如果您的 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({}); });
    }
    

    【讨论】:

    • 我无法让它工作,所以我只是删除了插件。事实证明,我什至不需要它。但是,我确实使用了您的一些代码来初始化其他 JQuery 插件。我发现在订阅中设置会话变量是一个非常好的技巧。非常感谢!如果有人遇到同样的问题,请在此处发表评论。
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多