插入时Meteor.autorun()不在客户端上工作

时间:2014-03-25 14:03:30

标签: meteor

我已经在那里敲了两天。

我正在创建一个搜索引擎,使用Meteor Framwork动态创建查询,查询工作正常,当我搜索时,我可以使用动态数据查询输出重新绑定UI(我的案例中的表)。

但是,如果插入/更新/删除操作发生数据对象

并且UI(html表)没有更新。

表示数据对象更改时不会重新呈现模板。

Template.search.rendered = function () {


   Meteor.autorun(function() {
        alarmsData = Alarms.find(getSearchSelector($('#searchTxt').val(), $('#startTimeTxt').val(), $('#endTimeTxt').val())).fetch()
        console.log("rendered")
        //alarmsData = Alarms.find({},{sort: {timestamp: "desc"} }).fetch();
        searchControls(alarmsData)
        getConsole(alarmsData, ".console")
        $('#badge').html(alarmsData.length)
   })

}

get控制台功能只是从搜索中读取数组并创建一个html表(这很好)

至于开始我正在创建一个简单的查询作为我的搜索的默认值。然后在用户更改搜索条件时更改此查询。我可以注意到,只保留和跟踪数据对象的第一个实例以进行更改,因此如果第二个搜索条件位于第一个搜索条件中,则会更新UI,如果没有发生任何事情

我已经使用了Meteor.autorun(function(){})函数但是我用console.log跟踪它的执行情况,我可以看到当我在数据库中为数据插入数据时它没有激励相同的集合。

3 个答案:

答案 0 :(得分:0)

一,我相信您正在尝试使用Deps.autorun。此外,您的自动运行中没有任何内容似乎依赖于反应源。由于alarmsData正在拍摄数据快照,因此当警报数据发生变化时,它不会关心。

其次,我可能会通过重定向来解决这个问题。我会编译我的数据,并重定向到同一页面,允许服务器处理我的查询。这很容易让你从其他任何地方跳转到这个页面,在参数中有一个预先填充的查询(因为路由会处理它),并且当搜索发生时也会对导航栏进行可视化更改(就像其他所有搜索引擎一样) )。你可以点击一下按钮做这样的事情:

var query = {},
    path;

query.text = encodeURIComponent($('#searchTxt').val()),
query.start = encodeURIComponent($('#startTimeTxt').val()),
query.end = encodeURIComponent($('#endTimeTxt').val()),

// redirect to current path
path = Router.routes[Router.current().route.name].path({}, {
    query: query
});

Router.go( path );

在路由器中,您只需将查询传递到服务器并作为数据对象路由(假设您使用的是iron-router):

this.route( "search", {
    path: "/search",
    waitOn: function() {
        return [
            Meteor.subscribe( "searchAlarms", _.omit( this.params, "hash" ) ),
        ]
    },
    data: function () {
        return { "query": _.omit( this.params, "hash" ) };
    }
});

这不仅会为您提供用于搜索的查询数据(在您的模板中),而且服务器现在可以处理您的搜索!您的警报数据现在包含显示给用户所需的所有文档,您不再需要订阅所有警报。这也很好,因为它会自动反应。因此,如果新的警报与您的查询过滤器匹配,它将自动传递给客户端并显示给用户,而无需设置任何额外的依赖关系/自动运行。

但请注意,如果您在其他地方订阅警报,则仍需要对客户端进行过滤。

答案 1 :(得分:0)

多么奇怪的流星代码......

  • "呈现"一旦您将呈现搜索模板,就会调用代码方法代码
  • getSearchSelector($('#searchTxt')。val()不是被动的,我的建议是使用会话变量将你的搜索条件放在里面并使用同一个会话在里面注入查找参数

您是否正在寻找显示所有警报数据?

function getAlarms()
{
    var text = Session.get("text");
    var from = Session.get("start");
    var to   = Session.get("end");
    var filter = getSearchSelector(text, from, to);
    return Alarms.find(filter);
}

Template.search.alarms = function () {
    return getAlarms();
}

Template.search.alarmsCount = function () {
    return getAlarms().count();
}

Template.search.events({
    'keypress input[name=text]' : function(e,o)
    {
        var val = $("input[name= text]").val()
        Session.set("text", val);
    },
    'keypress input[name=start]' : function(e,o)
    {
        var val = $("input[name=start]").val()
        Session.set("start", val);
    },
    'keypress input[name=end]' : function(e,o)
    {
        var val = $("input[name=end]").val()
        Session.set("end", val);
    }
});

//您的模板将类似于:

<template name="search">
    Search alarms
    <input type="text" name="text" placeholder="Enter your text here…"/>
    <input type="text" name="start" placeholder="start time"/>
    <input type="text" name="end" placeholder="end time/>

    There is {{alarmsCount}} alarms(s);

    {{#each alarms}}
    Alarm object: {{.}} 
    {{/each}}
</template>

答案 2 :(得分:0)

我猜它通过使用Session.set&amp;来解决它。 get,并自动订阅Serevr并发送动态查询。

检查以下代码

Template.zConsole.rendered = function(){

    Session.set("obj", getSearchSelector($('#searchTxt').val(), $('#startTimeTxt').val(), $('#endTimeTxt').val()))

    Deps.autorun(function (){
        Meteor.subscribe("dynamicAlarms", Session.get("obj"))
        console.log("Count from AutoRun ==> " + Alarms.find(Session.get("obj")).count())
    })

}

在服务器上

Meteor.publish('dynamicAlarms',function (searchObj) {
    return Alarms.find(searchObj)
})

&安培;它可以用更少的代码完美地完成。