我的目标是拥有一个类似Facebook的按钮,它可以有条件地出现在Ember视图中。我的模板是:
{{#if condition}}
Click Like: <div class="fb-like fb_edge_widget_with_comment fb_iframe_widget" data-href="http://www.facebook.com/obnob" data-send="false" data-layout="button_count" data-width="100" data-show-faces="false"></div>
{{else}}
Nothing to like here!
{{/if}}
如果condition
在页面生命周期内发生更改,则类似按钮的HTML代码将相应地插入和删除。问题是,如果在页面加载后插入like按钮的div,Facebook JavaScript库将不会解析它并将其转换为like按钮。要执行此操作,必须调用FB.XFBML.parse()
。
我尝试使用Ember.View
的didInsertElement()
钩子,但这仅在视图首次插入DOM时运行,而不是在它已经存在之后。
我试图通过在模板中添加一个脚本标签来解决这个问题:
<script>FB.XFBML.parse();</script>
这失败了,因为脚本阶段干扰了Metamorph的脚本标记。
问题
- Ember是否有一个钩子,可以在Metamorph更改已经渲染的Ember视图时运行代码
- 如何在Ember模板中编写脚本标签,而不会破坏Metamorph的标签
您可以为按钮定义视图,并在didInsertElement
函数中执行任何自定义逻辑。示例:
{{#if condition}}
{{view App.LikeButton}}
App.LikeButton = Em.View.extend({
templateName: 'like-button',
didInsertElement: function() {
//apply you custom logic here
}
})
每次渲染视图并将其添加到DOM后,都会调用didInsertElement
函数。
您可以观察视图中的变量。所以你会做
App.View = Ember.View.extend({
conditional: null,
_conditionalChanged: function() {
console.log('conditional changed');
}.observes('conditional')
})
这将允许您在条件更改时激发代码。
也就是说,基于你最初的问题,我认为你不应该使用条件来管理状态。您应该考虑在视图中使用StateManager。这样,当你的facebook按钮的状态发生变化时,不同的动作/事件可能会触发。事实上,你应该有一个完全独立的视图来负责设置facebook按钮。