2013-03-12 4 views
2

Есть ли способ чтения из переменной сеанса без повторной рендеринга шаблона при его изменении?Чтение переменной сеанса без контекста недействительности

Сценарий:

изменить стиль элементов динамически с помощью JQuery, но когда создается новый элемент, я хочу, чтобы установить его стиль по умолчанию (я знаю, что я мог бы назвать ту же команду, JQuery, когда элемент оказывается)

Пример:

<template name="image"> 
    <!-- How can I avoid -height- being reactive --> 
    <img src="img.jpg" style="height: {{height}}"> 
</template> 

Templates.image.height = function() { 
    return Session.get("height"); 
}; 

Templates.controls.events = { 
    'click #btn': function() { 
     // Change the height of all exiting images 
     $("img").css({height: Session.get("height")}); 
    } 
}; 

Я хотел бы каждое новое изображение добавляется к иметь высоту, хранящийся в переменной сеанса без повторного рендеринга img. Все решения, о которых я могу думать, выглядят как хаки.

+0

Я редактировал свой пост, я не уверен, что вы делаете с помощью кнопки, но остановить изображение освежающим вы можете использовать изолят только для изменения S небольшого блока – Akshat

ответ

3

Сессия хранит свои значения в Session.keys, но они сериализованы. Для десериализации их, вы можете использовать функцию parse из https://github.com/meteor/meteor/blob/master/packages/session/session.js:

var parse = function (serialized) { 
    if (serialized === undefined || serialized === 'undefined') 
    return undefined; 
    return EJSON.parse(serialized); 
}; 

Тогда вместо Session.get('key-name'), сделайте следующее: parse(Session.keys['key-name']). Это должно делать то же самое, что и Session.get, не делая никаких недействительными в любых контекстах. Положив все это вместе, вот такой подход, который, кажется, работает:

Session._parse = function (serialized) { 
    if (serialized === undefined || serialized === 'undefined') 
    return undefined; 
    return EJSON.parse(serialized); 
}; 

Session.getNonReactive = function (key) { 
    var self = this; 
    return self._parse(self.keys[key]); 
};  

UPDATE 3/13/2013: Метеор только что выпустили v0.5.8, а вместе с ним новая функция. Вот новый способ сделать это:

Session.getNonReactive = function (key) { 
    return Deps.nonreactive(function() { return Session.get(key); }); 
}; 

UPDATE 15/2/2016 метр в настоящее время не рекомендуется, хотя она по-прежнему работает. Используйте Tracker вместо:

Session.getNonReactive = function (key) { 
    return Tracker.nonreactive(function() { return Session.get(key); }); 
}; 
2

Вы можете использовать сохранить: http://docs.meteor.com/#template_preserve

Почему бы не использовать только JQuery или рули для обработки значения, почему как? С последовательностью, чтобы вы могли лучше управлять кодом.

Я мог бы помочь вам пример, если вы вывесили код до

Редактировать Этот пример только с

Ваш код, используя рули код:

<template name="image"> 
    <!-- How can I avoid -height- being reactive --> 
    {{#isolate} 
    <img src="img.jpg" style="height:{{height}}"> 
    {{/isolate}} 
</template> 

Template.image.height = function() { 
    return Session.get("height") || "0px"; //Default height is no session defined 
}; 

Template.controls.events = { 
    'click #btn': function() { 
     //What does this do exactly? 
     //$("img").css({height: Session.get("height")}); 

     Session.set("height","40px"); 
    } 
}; 

Чтобы предотвратить ваше целое шаблон, повторно отображаемый, помещает вашу реактивную переменную {{height}} в {{#isolate}}. См. Раздел изоляции реактивности: http://docs.meteor.com/#isolate

+0

звучит здорово. Но как только я добавляю {{#isolate}} внутри 'style', он не отображается так, как ожидалось. Вы попробовали? – Xyand

+0

Я попробовал это снова без изоляции, и я не могу получить изображения для обновления/перерисовки: gist с проектом, который я использовал для тестирования этого @ https: //gist.github.com/anonymous/5142555 – Akshat

+0

Итак, с этим я переместил изоляцию abit, так что это должно работать так, как вы хотите – Akshat

Смежные вопросы