灰烬工具提示传递变量

时间:2018-11-13 13:39:45

标签: ember.js

我正在构建一个Ember工具提示模块,以在悬停时创建动态内容。

<div class="custom-tool-wrapper">
  {{#custom-tool-tipster
     side="right"
     content=(or getContent question.id)
     contentAsHTML=true
     class="tool-tipster-field"}}
        Preview
  {{/custom-tool-tipster}}
</div>

在ember控制器中-函数不会返回变量“ question.id”-在始终为字符串“ q-1”时,它将始终返回为0

export default Ember.Component.extend({

  getContent(tips){
    console.log("tips1")
    console.log("question", tips);
  },

});

1 个答案:

答案 0 :(得分:1)

我认为您实际上想要实现的目标最好是通过question模型对象上的computed property完成(您的问题仍然很模糊)。

content: computed('id', function(){
   //this.tips is a part of the model object
   //compute and return whatever the content is
   return "content";
}

然后说:

{{#custom-tool-tipster
     side="right"
     content=model.content
     contentAsHTML=true
     class="tool-tipster-field"}}
        Preview
{{/custom-tool-tipster}}

如果您需要实际调用一个函数(很少会想到一个实例,在涉及状态的情况下计算属性并不是更好的解决方案),则可以使用自定义handlebars helper

(or a b)(a || b),如果您将ember truth helpers库用于or助手,则不会像您尝试的那样调用函数。看来您正在尝试完成ember-invoke允许的操作

import Ember from 'ember';
import { helper } from '@ember/component/helper';

export function invokeFunction([context, method, ...rest]) {
  if (typeof context[method] !== 'function') {
    throw new Error(`Method '${method}' is not defined or cannot be invoked.`);
  }

  return Ember.get(context,method).apply(context, rest);
}

export default helper(invokeFunction);

可以像content=(invoke this "getContent" question.id)一样用于调用和返回传入的上下文对象(如果是路由模板,则为this的控制器)上的函数值。让我清楚一点,我认为这种invoke方法是一个可怕的想法,并且确实摆脱了您的关注点分离,并且我不主张您这样做。模板不应该包含您的逻辑,并且绝对不应该在您拥有诸如计算属性之类的良好功能时在控制器上调用任意函数。