2015-10-08 61 views
0

爲什麼這不是反應?更重要的是,如何才能做出反應?爲什麼這個模板沒有反應?

我想要將數據保存在Mongo中並在模板中使用。我可以使用ReactiveVar或ReactiveDict。我需要兩份數據嗎?

是不是Suspects.findOne('bruce')已經返回一個被動對象?我試圖直接在Bruce上提供human答案,但沒有觸發更新。

事件fire,log(this)顯示bruce的答案已更改,但該模板未重新呈現。有什麼好辦法做到這一點?

http://meteorpad.com/pad/KoH5Qu7Fg3osMQ79e/Classification

這是流星1.2 iron:router補充說:

<head> 
    <title>test</title> 
</head> 

<template name="question"> 
    {{#unless isAnswered 'human'}} <!-- :-< I'm not reacting here --> 
    <div>Sir, are you classified as human?</div> 
    <button id="no">No, I am a meat popsicle</button> 
    <button id="smokeYou">Smoke you</button> 
    {{else}} 
    <div> Classified as human? <b>{{answers.human}}</b></div> 
    {{/unless}} 
</template> 

和JavaScript:

// Why isn't this reactive? 
if (Meteor.isClient) { 
    Template.question.helpers({ 
    isAnswered: function (question) {  // :-< I'm not reactive 
     var suspect = Template.instance().data; 
     return (typeof suspect.answers[question] !== 'undefined'); 
    } 
    }); 

    Template.question.events({ 
    'click #no': function() { 
     this.answers.human = "No"; // :-< I'm not reactive 
     console.log(this); 
    }, 
    'click #smokeYou': function() { 
     this.answers.human = "Ouch"; // :-< I'm not reactive 
     console.log(this); 
    } 
    }); 
} 

// Collection 
Suspects = new Meteor.Collection('suspects'); 
if (Meteor.isServer) { 
    Meteor.startup(function() { 
    // code to run on server at startup 
    Suspects.upsert('bruce', { quest: 'for some elements', answers: {}}); 
    }); 
    Meteor.publish('suspects', function() { 
    return Suspects.find({}); 
    }); 
} 

// Iron Router 
Router.route('/', { 
    template: 'question', 
    waitOn: function() { 
    return Meteor.subscribe('suspects'); 
    }, 
    data: function() { 
    return Suspects.findOne('bruce'); 
    } 
}); 

感謝:-)

回答

1

events實際上並未更新反應型數據源(db記錄)。而不是做的:

Template.question.events({ 
    'click #no': function() { 
    this.answers.human = "No"; 
    } 
}); 

的事件需要執行數據庫操作,通過直接update或通過Meteor.call()Meteor.method。例如:

'click #no': function(){ 
    Suspects.update('bruce', {'answers': {'human': 'no'}}); 
} 

如果使用這種模式,您還需要設置正確的allowdeny規則,以允許從客戶端代碼更新。 http://docs.meteor.com/#/full/allow。方法通常最終成爲更大項目的更好模式。

此外,我不確定我的頭頂上在您的helper將被反應。我會用Template.currentData()來代替。 http://docs.meteor.com/#/full/template_currentdata

+0

謝謝! fyi heres a [working meteorpad](http://meteorpad.com/pad/jfS9L85ikJpmDQYec/Classification%20(已解決))。 –

1

非常接近,你只需要使用ReactiveVar由它的聲音我牛逼幾乎解釋了它的:) http://docs.meteor.com/#/full/reactivevar

,這裏是如何使用它

if (Meteor.isClient) { 
    Template.question.onCreated(function() { 
    this.human = new ReactiveVar(); 
    }); 

    Template.question.helpers({ 
    isAnswered: function (question) { 
     return Template.instance().human.get(); 
    } 
    }); 

    Template.question.events({ 
    'click #no': function (e, t) { 
     t.human.set('No'); 
     console.log(t.human.get()); 
    }, 
    'click #smokeYou': function(e, t) { 
     t.human.set('Ouch'); 
     console.log(t.human.get()); 
    } 
    }); 
} 

UPDATE:如果您使用的是鼠標,我通常喜歡把它放在模板級別不是鐵路由器:

if (Meteor.isClient) { 
    Template.question.helpers({ 
    isAnswered: function (question) { 
     return Suspects.findOne('bruce'); 
    } 
    }); 

    Template.question.events({ 
    'click #no': function (e, t) { 
     Suspects.update({_id: ''}, {$set: {human: 'No'}}); 
    }, 
    'click #smokeYou': function(e, t) { 
     Suspects.update({_id: ''}, {$set: {human: 'Ouch'}}); 
    } 
    }); 
} 
+0

嗯......我想要數據留在布魯斯並保存到Mongo。我需要製作兩份答案嗎?另外,謝謝:-) –

+0

另外,Suspects.findOne('bruce')'還沒有返回一個反應對象嗎? –

+0

@MichaelCole噢,我沒有看到它錯過了抱歉。 –