2016-01-17 31 views
1

我有一個訂閱文檔的模板。只要模板助手中使用的屬性發生更改,一切都可以在DOM和Blaze更新中正常工作。如何更新流星中的屬性更改?

我也有一些自定義邏輯不會出現在DOM中,並取決於文檔屬性。如何在屬性更新時調用函數來更改該邏輯?

我正在尋找類似this.data.attr.onChanged的地方,其中this將引用模板,而this.data是像往常一樣發送到模板的數據;或流星功能,重新運行的地方,我可以把我的回調英寸

我希望template.onRendered會被召回,但事實並非如此。

我讀了很多關於被動變量的內容,但是無法找到它們在這裏的用處。

[編輯]的變化是從與其他服務

我已經試過Tracker.autorun這樣的通信的服務器未來:

Template.editItem.onRendered(function() { 
    var self = this; 
    Tracker.autorun(function() { 
    console.log("tracker", self.data.item.socketId); 
    }); 
}); 

以及相應的路線:

Router.route('editItem', { 
    path: '/edit/:_id', 
    waitOn: function() { 
    var sub = Meteor.subscribe('item', this.params._id); 
    return [sub]; 
    }, 
    data: function() { 
    return {item: Items.findOne(this.params._id)}; 
    }, 
    action: function() { 
    if (this.ready()) 
     this.render(); 
    } 
}); 

在某些時候,屬性socketId從相應的文檔中被服務器刪除,我確信由於我已經檢入了shell,但跟蹤器不會重新運行。

回答

2

使用Template.currentData().item.socketId,而不是self.data.item.socketId,這會給你反應。

並且在模板中通常使用self.autorun而不是Tracker.autorun(與Tracker.autorun不同,這將確保當模板被銷燬時停止自動運行)。同樣,如果您想在模板中訂閱,請使用self.subscribe而不是Meteor.subscribe

查看模板的代碼。currentData()適用於您:

Template.editItem.onRendered(function() { 
    var self = this; 
    self.autorun(function() { 
    console.log("tracker", Template.currentData().item.socketId); 
    }); 
}); 
+0

Yep'Template.currentData()'是我錯過了使數據反應。感謝您節省我創建一個反應變量,從助手中更新,需要由隱藏元素調用。 – Guig

2

我不知道我是否正確,你只是想觀察你的html輸入,並將新值應用到你的幫助方法上?

如果是這樣,你可以使用會話變量來存儲您的臨時UI狀態:

// observe your input 
Template.yourTemplate.events({ 
    "change #inputA": function (event) { 
    if(event.target.value != "") { 
     Session.set("valueA", event.target.value); 
    } 
    } 
} 

// apply the changed value on your helper function 
Template.yourTemplate.helpers({ 

    getSomeData: function() { 
    var a = Session.get("valueA"); 
    // do something with a .. 
    } 
} 

在流星的官方todo app tutorial這個概念也被使用。

+0

更改來自服務器。抱歉,我一開始應該更清楚。我已經更新了這個問題。 – Guig

2

如果您需要重新運行不屬於DOM /幫助程序的內容,則可以使用Tracker.autorun。根據流星文檔,現在運行一個函數,並在其相關性發生變化時重新運行。

here's the docs link

+0

是的,我已經嘗試過(我更新了更多信息的問題),但沒有奏效 – Guig

0

嘗試訂閱移動到Tracker.autorun

Template.editItem.onRendered(function() { 
    var self = this; 
    Tracker.autorun(function() { 
     Meteor.subscribe('item', this.params._id); 
     console.log("tracker", self.data.item.socketId); 
    }); 
}); 

當然你也可以不使用this.params有那麼你可以存儲這個作爲一個Session變量

+0

它似乎也不工作..它只運行一次 – Guig

+0

好吧,如果你,而不是在路線中傳遞數據方法,你將它傳遞給模板助手,這些助手肯定是被動的。 – durrrr

+0

是的模板助手是完全反應性的例外,但它不覺得正確的代碼沒有專門附加到DOM渲染,我找不到如何將數據從onCreated/onRendered傳遞給助手。 .. 我可以用正確更新的幫助程序將我的變量寫入DOM,並定期檢查DOM元素的值,但這感覺非常錯誤 – Guig