我无法弄清楚Meteor {{#isolate}}到底是什么。有什么例子吗?

时间:2012-10-31 09:51:46

标签: meteor

如何使用{{#isolate}}?

如果我创建一个包含大量模板的页面,例如:

{{> page1}}

<template name="template1">reactive source1</template>
<template name="template2">reactive source2</template>
<template name="template3">reactive source3</template>
<template name="template4">reactive source4</template>
<template name="template5">reactive source5</template>

<template name="page1">
    {{> template1}}
    {{> template2}}
    {{> template3}}
    {{> template4}}
    {{> template5}}
</template>

如果每个模板都有更新内容,那么每次都会重新渲染整个页面吗?我如何阻止这种情况发生?

我应该在这种情况下使用isolate吗?

如果我将任何助手绑定到这些模板,例如:

Template.template1.rendered = ->
    console.log 'rendered at: ' + new Date().getTime()

它会呈现至少5次,因为我有5个反应源。如果他们每个人都包括一个 反应列表,它将呈现docs.length次。

我无法控制单个模板实例。

对不起我的英语。

以下是我之前在GitHub上发布的与此相关的问题:https://github.com/meteor/meteor/issues/435

1 个答案:

答案 0 :(得分:6)

if each single template has content update it will rerender the whole page ?

不,但所有其父母的渲染事件都将被触发!实际上,渲染事件像dom事件一样传播。 当特定模板中的反应数据发生变化时,将重新呈现其及其所有子模板的内容!但不是他的父母! 然后什么“常数”和“孤立”呢?我认为找出它们的最好方法是做一些测试。 这是一个简单的测试: HTML:

    <head>
    <title>meteor_test</title>
</head>

<body>
    {{> main}}
</body>

<template name="main">
    This is main template!
    {{> subA}}
    {{> subB}}
</template>

<template name="subA">
    <div>
        ----This is subA! Input is surrounded by "constant"!
        {{#constant}} <input /> {{/constant}}
        Reactive data: {{reactiveData}}
        {{> subA_A}}
    </div>
</template>

<template name="subA_A">
    <div>
        --------This is subA_A!
        <input type="text" />
        Reactive data: {{reactiveData}}
    </div>
</template>

<template name="subB">
    <div>
        ----This is subB! Reactive data is surrounded by "isolate"!
        <input type="text" />
        Reactive data: {{#isolate}} {{reactiveData}} {{/isolate}}
        {{> subB_A}}
    </div>
</template>

<template name="subB_A">
    <div>
        --------This is subB_A!
        <input type="text" />
        Reactive data: {{reactiveData}}
        {{> subB_A_A}}
    </div>
</template>

<template name="subB_A_A">
    <div>
        ------------This is subB_A_A!
        <input type="text" />
        Reactive data: {{reactiveData}}
    </div>
</template>

JS:

if (Meteor.isClient) {
    Template.main.rendered = function () {
        console.log('main is rendered at %s', new Date());
    };

    Template.subA.helpers({
        reactiveData: function () {
            return Session.get('subA');
        }
    });
    Template.subA.rendered = function () {
        console.log('subA is rendered at %s', new Date());
    };

    Template.subB.helpers({
        reactiveData: function  () {
            return Session.get('subB');
        }
    });
    Template.subB.rendered = function () {
        console.log('subB is rendered at %s', new Date());
    };

    Template.subA_A.helpers({
        reactiveData: function () {
            return Session.get('subA_A');
        }
    });
    Template.subA_A.rendered = function () {
        console.log('subA_A is rendered at %s', new Date());
    };

    Template.subB_A.helpers({
        reactiveData: function () {
            return Session.get('subB_A');
        }
    });
    Template.subB_A.rendered = function () {
        console.log('subB_A is rendered at %s', new Date());
    };

    Template.subB_A_A.helpers({
        reactiveData: function () {
            return Session.get('subB_A_A');
        }
    });
    Template.subB_A_A.rendered = function () {
        console.log('subB_A_A is rendered at %s', new Date());
    };
}

使用chrome / firebug的控制台更改会话数据,看看会发生什么。注意当反应变化时是否清除输入这些输入的文本(意味着重新渲染)以及是否触发了渲染事件。

......对不起我的英语,^ _ ^