【问题标题】:Meteor session object not working reactivelyMeteor 会话对象没有反应性地工作
【发布时间】:2017-07-24 02:59:11
【问题描述】:

我有两个页面,fila.jsretirada.js

fila.js 包含一个名为 atualizarChamadas 的函数,我将其导出到 retirada.js

当我从 fila.js 调用该函数时,它可以正常工作,但是当我在 retirada.js 中调用它时,会话对象或 reactive-var 在帮助程序中无法响应式地工作。

我在fila.js中的函数:

export default function atualizarChamadas() {
    let chamadas = Chamadas.find({medico: 1},{sort: {data_inicio: -1}}).fetch();
    //Session.set("chamadas", chamadas);
    ChamadasReactive.set(chamadas);
}

我的模板助手

    Template.fila.helpers({
    chamadasAtendimento: function() {
        //return Session.get("chamadas");
        return ChamadasReactive.get().filter((el)=>{
            return el.status == 'A';
        }).slice(0,11);
      }
});

Template.fila.helpers({
    chamadasEspera: function() {
        //return Session.get("chamadas");

        return ChamadasReactive.get().filter((el)=>{
            return el.status == 'E';
        }).slice(0, 11);
      }
});

Template.fila.helpers({
    chamadasFinalizada: function() { 
        return ChamadasReactive.get().filter((el)=>{
            return el.status == 'F';
        }).slice(0, 11);
      }
});

fila.js 中我调用了该函数,它工作正常:

    Template.fila.events({
        "submit form": function (e, template){
            e.preventDefault();
            atualizarChamadas();
        }

});

我有这个 blaze 模板,当从 fila.js 调用函数时可以正常工作:

<tbody>  
        {{#each chamada in chamadasEspera}}
            <tr class="success">
                <td>{{chamada.senha}}</td>
                <td>{{chamada.data_inicio}}</td>
                <td></td>
                <td>
                    <select id="{{chamada._id}}" class="form-control">
                        <option value="E">Esperando</option>
                        <option value="A">Atendimento</option>
                        <option value="F">Finalizado</option>
                    </select>
                </td>
                <td><button id="{{chamada._id}}" value="{{chamada.senha}}" name="{{chamada.status}}" class="btn btn-block">Chamar</button></td>

            </tr>
         {{/each}}
    </tbody>


    <br/>

    <tbody>
    {{#each chamada in chamadasAtendimento}}
            <tr class="danger">
                <td>{{chamada.senha}}</td>
                <td>{{chamada.data_inicio}}</td>
                <td></td>
                <td>
                    <select id="{{chamada._id}}"  class="form-control">
                        <option value="A">Atendimento</option>
                        <option value="E">Esperando</option>
                        <option value="F">Finalizado</option>
                    </select>
                </td>
                <td><button id="{{chamada._id}}" value="{{chamada.senha}}"  name="{{chamada.status}}" class="btn btn-block">Chamar</button></td>
             </tr>
     {{/each}}
    </tbody>

    <br/>
    <tbody>
    {{#each chamada in chamadasFinalizada}}
        <tr class="info">
            <td>{{chamada.senha}}</td>
            <td>{{chamada.data_inicio}}</td>
            <td>{{chamada.data_fim}}</td>
            <td>
                <select id="{{chamada._id}}"  class="form-control">
                    <option value="F">Finalizada</option>
                    <option value="E">Esperando</option>
                    <option value="A">Atendimento</option>
                </select>
            </td>
            <td></td>
        </tr>
    {{/each}}
     </tbody>
  </table>
  {{/if}}

在我的页面retirada.js 我有这段代码调用atualizarChamadas,但它不能响应式地工作:

 Template.retirada.events({
    "click button": function(e,template){
        let newPass = e.target.id,
            id = Retirada.find({}).fetch()[0]._id;

        console.log('01:' + Chamadas.find({medico: 1},{sort: {data_inicio: -1}}).fetch().length);

        Retirada.update(id, {count: newPass});
        Chamadas.insert(
            {senha: newPass, status : 'E', data_inicio: new Date(), medico: 1});

        console.log('02:' + Chamadas.find({medico: 1},{sort: {data_inicio: -1}}).fetch().length);

        setTimeout (teste, 1000);

        function teste(){
            atualizarChamadas();
        }
    }
     });

console.log被调用时,我可以看到chamadas的对象结果的长度增加了,但是我的模板没有刷新新数据。我是用方法来改变文档的,但是我改变它是为了在视图上做的,但还是不行。

我需要一些帮助。

【问题讨论】:

    标签: javascript meteor meteor-blaze


    【解决方案1】:

    我认为问题来自在事件处理程序中使用 Meteor 调用。这里有几个允许响应式方法调用的替代包:meteor-reactive-methodmnmtanish:call

    【讨论】:

    • 我停止使用方法调用,现在我直接在视图上更改mongo文档,但还是不行
    • 我通常通过在 Meteor 调用中直接使用 jquery 更改视图来解决这些问题。我会更新我的答案。
    • 刚刚注意到您更改了代码。你用的是铁路由器吗?您可以返回光标(Chamadas.find() 作为路线数据的一部分)。这非常可靠。如果您需要过滤器,会话变量将在 Iron 路由器的数据上下文中工作。如果您需要有关如何执行此操作的更多信息,请告诉我。出于安全原因,您仍应在服务器端使用 Meteor 调用,并阻止来自客户端的插入/更新/删除操作。
    • 我更改了代码以更清楚地理解,我删除了方法调用,我也使用了 Iron-router,我将尝试使用 Iron 返回我的收藏并再次回来,谢谢!
    • 我在template.rendered中使用了来自iron的数据,它工作正常,但只是在第一次重新加载时,如何从另一个页面做到这一点?
    【解决方案2】:

    我用这个代码块解决了我的问题,我直接在帮助程序返回中使用了集合,并且每当我的集合发生变化时反应性再次起作用。

    Template.fila.helpers({
        chamadasAtendimento: function() {
            //return Session.get("chamadas");
            return Chamadas.find({medico: 1},{sort: {data_inicio: -1}}).fetch().filter((el)=>{
                return el.status == 'A';
            }).slice(0,11);
          }
    });
    
    Template.fila.helpers({
        chamadasEspera: function() {
            return Chamadas.find({medico: 1},{sort: {data_inicio: -1}}).fetch().filter((el)=>{
                return el.status == 'E';
            }).slice(0, 11);
          }
    });
    
    Template.fila.helpers({
        chamadasFinalizada: function() { 
            return Chamadas.find({medico: 1},{sort: {data_inicio: -1}}).fetch().filter((el)=>{
                return el.status == 'F';
            }).slice(0, 11);
          }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 2016-06-21
      • 2023-03-26
      • 1970-01-01
      • 2011-03-15
      • 2019-05-03
      • 2020-03-26
      相关资源
      最近更新 更多