2013-02-09 24 views
5

Tôi đang sử dụng Meteor và gặp sự cố khi nội dung của tôi được hiển thị lại khi tôi không muốn.Nội dung được bao bọc trong hiện tạiHiển thị lại người dùng khi người dùng cập nhật

Tôi có nội dung chính của mình được bao bọc trong tuyên bố currentUser nếu tôi cảm thấy khá chuẩn.

{{#if currentUser}} 
    {{> content}} 
{{/if}} 

Vấn đề với mẫu nội dung của tôi đang được hiển thị lại khi tôi cập nhật đối tượng người dùng của mình. Có cách nào để khắc phục điều này? Tôi không tham chiếu đến người dùng ở bất kỳ đâu bên trong mẫu nội dung.

Cảm ơn bạn!

Dưới đây là một ứng dụng mẫu để tái tạo vấn đề của tôi:

HTML

<head> 
    <title>Render Test</title> 
</head> 

<body> 
    {{loginButtons}} 

    {{> userUpdate}} 

    {{#if currentUser}} 
    {{> content}} 
    {{/if}} 
</body> 

<template name="userUpdate"> 
    <p> 
    <input id="updateUser" type="button" value="Update User Value" /> 
    User last update: <span id="lastUpdated">{{lastUpdated}}</span> 
    </p> 
</template> 

<template name="content"> 
    <p>Render count: <span id="renderCount"></span></p> 
</template> 

Javascript

if (Meteor.isClient) { 
    Meteor.startup(function() { 
    Session.set("contentRenderedCount", 0); 
    }); 

    Template.content.rendered = function() { 
    var renderCount = Session.get("contentRenderedCount") + 1; 
    Session.set("contentRenderedCount", renderCount); 
    document.getElementById("renderCount").innerText = renderCount; 
    }; 

    Template.userUpdate.events = { 
    "click #updateUser": function() { 
     Meteor.users.update({_id: Meteor.userId()}, {$set: {lastActive: new Date()}}); 
    } 
    }; 

    Template.userUpdate.lastUpdated = function() { 
    return Meteor.user().lastActive; 
    }; 

} 

if (Meteor.isServer) { 
    Meteor.users.allow({ 
    'update': function() { 
     return true; 
    } 
    }); 
} 

Cập nhật: tôi nên đã giải thích ví dụ này một ít. Sau khi tạo người dùng, nhấp vào nút Cập nhật giá trị người dùng, khiến số lần hiển thị tăng lên. Điều này là bởi vì nó được bọc trong một {{#if currentUser}}. Nếu điều này xảy ra nếu bị xóa, bạn sẽ thấy số lần hiển thị vẫn còn ở 1.

Ngoài ra, bạn sẽ cần thêm gói accounts-uiaccounts-password vào dự án của mình.

Trả lời

8

Meteor sẽ hiển thị lại mọi mẫu chứa biến phản ứng được thay đổi. Trong trường hợp của bạn, {{currentUser}}Meteor.user() là một đối tượng chứa dữ liệu của người dùng. Khi bạn cập nhật hồ sơ người dùng, đối tượng thay đổi và nó cho phép thiên thạch tính lại mọi thứ phản ứng liên quan đến đối tượng.

Chúng ta có thể làm thay đổi phản ứng một chút vì vậy nó chỉ phản ứng với những thay đổi trong việc người dùng đăng nhập/out và không bất cứ điều gì trong các đối tượng chính nó:

Meteor.autorun(function() { 
    Session.set("meteor_loggedin",!!Meteor.user()); 
}); 

Handlebars.registerHelper('session',function(input){ 
    return Session.get(input); 
}); 

html của bạn

{{#if session "meteor_loggedin"}} 
    {{> content}} 
{{/if}}  
+0

Đó làm việc hoàn hảo. Cảm ơn bạn! – Irving

+1

@MurWade với động cơ Blaze mới giới thiệu với Meteor 0.8.3 một vài tháng trước. Bây giờ bạn có thể chỉ sử dụng '{{#if currentUser}} ... {{/ if}}' mà không có nội dung bên trong hiển thị lại – Akshat

+0

Sử dụng {{pathFor route = 'dashboard'}} bên trong kiểm tra làm cho nó hiển thị lại , bất kỳ ý tưởng làm thế nào để vô hiệu hóa nó? – digz6666

Các vấn đề liên quan