【问题标题】:Rerendering Handlebars template upon data change在数据更改时重新渲染 Handlebars 模板
【发布时间】:2015-06-22 16:50:12
【问题描述】:

我有一个模板,它基于 JSON 对象中的某个布尔值显示一个按钮。它可以显示两个不同的按钮。

编译模板的代码:

source   = $('#some-template').html(); // Get the HTML source of the template
template = Handlebars.compile(source); // Compile it
$('#some-div-container').html(template(someJsonObject));

假设对象如下所示:

someJsonObject = { 
    smeBooleanValue : false, 
    someOtherValue : 5 
}; 

模板看起来像这样:

<div id="some-div-container">
    <script id="some-template" type="text/x-handlebars-template">
        <button type="button" class="btn btn-default btn-lg" onclick="myGreatMethodForDoingThings()">
        {{#if smeBooleanValue}} <span class="glyphicon glyphicon-stop" aria-hidden="true"></span> Do something
        {{else}} <span class="glyphicon glyphicon-play" aria-hidden="true"></span> Do something else{{/if}}
        </button>
    </script>
</div>

问题是当someJsonObject 中的布尔值发生变化时,视图不会更新。我以为这会自动发生(就像 Meteor 中的 Handlebars 一样),但似乎我错了?

在这种情况下:它是如何完成的?我可以有一个重新渲染模板的方法,它可以在值的设置器中调用。问题是,带有$('#some-div-container').html(template(someJsonObject)); 行的方法似乎不能解决问题。

我显然在这里遗漏了一些东西。提前非常感谢!

【问题讨论】:

标签: jquery handlebars.js


【解决方案1】:

Handlebars 不处理数据绑定以更新值更改。您可以使用像 ember 这样的框架,它带有双向数据绑定。

在数据更改时执行重新渲染的一种普通方法是使用Object.observe

Object.observe(someJsonObject, function() { template(someJsonObject); });

【讨论】:

  • 啊,当时让我感到困惑的是我使用 Meteor 的经历。谢谢! Object.observe(someJsonObject, function() { $('#some-container').html(template(someJsonObject)); }); 正是我想要的。
  • @Esso 请记住,并非所有浏览器都支持 Object.observe (caniuse.com/#feat=object-observe)。对于不受支持的浏览器,您可能需要使用 polyfill
  • 来自MDN 此功能已过时。尽管它可能在某些浏览器中仍然有效,但不鼓励使用它,因为它可能随时被删除。尽量避免使用它
猜你喜欢
  • 2014-03-14
  • 2013-01-22
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2018-04-20
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多