我想定义一个这样的函数(在这种情况下在一个组件中):
doSomething: function() {
// do something
}.observes('yield')
组件把手文件基本上可以是:
...
{{yield}}
...
这会做我想要的吗?也就是说,当屈服值改变时,是否会调用doSomething()函数?
答案 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来解决它!