你能用{{yield}}使用observes()吗?

时间:2014-08-24 01:20:20

标签: ember.js handlebars.js

我想定义一个这样的函数(在这种情况下在一个组件中):

doSomething: function() {
  // do something
}.observes('yield')

组件把手文件基本上可以是:

...
{{yield}}
...

这会做我想要的吗?也就是说,当屈服值改变时,是否会调用doSomething()函数?

1 个答案:

答案 0 :(得分:2)

你应该使用参数而不是收益率内容!像:

从模板中调用它:

{{tool-tip value=myValue"}}

和控制器:

myValue: function() {
  return 'Hi %@, welcome to %@'.fmt(this.get('val1'), this.get('val2'));
}.property('val1', 'val2');

而不是您可能想要使用的解决方案:

{{tool-tip}}
  Hi {{val1}}, welcome to {{val2}}
{{tool-tip}}

让我向你解释你的想法的问题:

{{yield}}所在的地方是模板。你可以观察模板,但模板本身永远不会改变。模板是一个编译好的车把模板!

因此甚至没有字符串Hi {{val1}}, welcome to {{val2}},但是有一个编译版本。因此,如果您使用JSON Hi Krutius, welcome to StackOverflow调用它,则会产生{ val1: "Krutius", val2: "StackOverflow" }的javascript函数。

你知道,这个功能永远都是一样的!

所以你有两个问题:

  • 第一个是获取您需要插入包含工具提示的title属性的结果HTML,或者将tooltip()函数作为template提供属性。这很棘手。一个有效的解决方案是在隐藏标签中使用{{yield}},抓取html并将其放入工具提示中。这将起作用(只要值不改变),但绝对是一个肮脏的解决方案。我想你可能已经这样做了,这就是为什么你要观察{{yield}}。 但重要的是要知道这个观点不会让人失望!对于每个值,都会创建一个视图,并在DOM中插入一些奇怪的<script>标记,然后将观察者附加到该单个值,当值发生更改时,可以找到DOM中的特定位置{ {1}}标记,值将更新。 将来HTMLBars出现时,此行为将会发生变化。所以你不能继续它。也许更好的工作方式是自己调用把手功能来获取html。

  • 但你还有另一个问题。车把功能的结果何时会改变?为此,您需要知道生成的把手功能需要什么属性。你可能可以通过分析它来做到这一点,但也许功能与HTMLBars不同?并且需要对内部渲染HTML的内部方式进行大量的黑客攻击!


所以,总而言之,不要这样做。通过给组件提供单个值并自己为此值呈现HTML来解决它!