繁体   English   中英

MeteorJS-为什么数据更改后我的页面没有重新呈现?

[英]MeteorJS - Why is my page doesn't re-render when the data changed?

我正在使用MeteorJS 1.0.2.1填充应用程序。 首先,这是我的searchResults模板:

<template name="searchResults">
    <div class="dummy-column">
        <h2>Search Results</h2>
        <ul>
            {{#each results}}
                <li>
                    {{city}} - {{state}}
                </li>
            {{/each}}
        </ul>
    </div>
</template>

这是脚本文件,用于处理一些事件并为searchResults模板提供帮助:

Template.searchResults.helpers({
    results: function(){
        console.log("reach here only 1 time !");
        Meteor.subscribe('zips_results', key, function(){
            return Zips.find().fetch();
        });
    }
});

var key = '';

Zips = new Meteor.Collection('zips');

$(document).ready(function() {
    $('.morphsearch-input').keyup(function(){
        key = $(".morphsearch-input").val();
    });
});

所以我想要的是,每当我输入$('.morphsearch-input')搜索输入时,我的应用将通过调用以下命令分别返回搜索结果:

Meteor.subscribe('zips_results', key, function(){
                return Zips.find().fetch(); // And I've tested that this runs correctly
            });

但是问题在于,似乎Template.searchResults.helpers.results仅被调用一次(在加载开始时),这使得我的模板没有更改。 我仍然不知道为什么这行不通。 所以我希望你们能帮助我! 非常感谢你们先进!

首先将搜索输入文本模板添加到searchResults模板中。 它必须在单独的模板中, 在这里阅读原因。

searchResults.js

<template name="searchResults">
{{>searchInput}}
<div class="dummy-column">
    <h2>Search Results</h2>
    <ul>
        {{#each results}}
            <li>
                {{city}} - {{state}}
            </li>
        {{/each}}
    </ul>
</div>

使用会话使您的模板更具交互性。 在下面的模板中,我们获得键入的文本并将其存储在Sesion变量中。

searchInput.js

Template.searchInput.events({
  'keyup input.search-zip': function (event, template) {
      event.preventDefault();
      Session.set('searchZip', event.currentTarget.value);
  }
});

相应的模板必须是:

searchInput.html

<template name="searchInput">
    <div class="form-group">
        <input type="text" class="form-control search-zip" placeholder="Search for zip...">
    </div>
</template>

之后,将以上内容放在searchResults javascript文件中。 更改您的订阅(Meteor.subscribe(“ zips”)),将所有邮政编码放入miniMongo中,然后在结果助手中找到用户搜索的数据。

searchResults.js

//This brings all zips into miniMongo and then into helper you 
//make the query while the user typing
Meteor.subscribe("zips");
Template.searchResults.helpers({
    results: function() {
        return Zips.find({youKey:Session.get('searchZip')})
    }
});

希望我能对您有所帮助

订阅的readyCallback不应返回任何内容(返回值不会发生任何事情)。 我会做这样的事情:

Template.searchResults.helpers({
    results: function(){
        return Zips.find();
    }
});

Template.searchResults.events({
    'keyup .morphsearch-input': function(event, template){
        if(template.handle){
            template.handle.stop()
        }
        var key = event.currentTarget.value
        template.handle = Meteor.subscribe('zips_results', key);
    }
});

Template.searchResults.destroyed = function()
    this.handle.stop()
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM