ember.js 为什么embe.rjs在模板中看不到我的控制器方法?

camsedfj  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(127)

在项目中,我有模板输入:

{{#if (communicationPreferenceIs 'Phone')}}
    <div class="row">
                        <div class="col-md-4 form-label">
                            Phone<i class="required">*</i>
                        </div>
                        <div class="col-md-8">
                            {{input-validation
                                    type="text"
                                    required=true
                                    class="form-control"
                                    value=model.phone
                                    placeholder="Phone"
                                    pattern="[0-9]*"
                                    maxlength="30"
                                    onkeydown=""
                                    key-down="validateInput"
                            }}
                        </div>
                    </div>
    {{/if}}

我需要一个条件渲染,并将其 Package 在if构造中。在其中,我使用控制器中的方法communicationPreferenceIs来检查值。下面是它的代码:

App.EditController = Ember.Controller.extend(Ember.Evented, {
communicationPreferenceIs: function(preference) {
    const model = this.get('model');
    if (!model.communicationPreference || !model.communicationPreference.name) {
      return false;
    }

    const currentPreference = model.communicationPreference.name;

    return currentPreference === preference;
  }.property('model.communicationPreference'),
}

所以,在渲染时,我得到一个错误:

"Assertion Failed: A helper named 'communicationPreferenceIs' could not be found"

我尝试了一下,发现这个方法很有效:

communicationPreferencePhone: function() {
    const model = this.get('model');
    return (
        model.communicationPreference &&
        model.communicationPreference.name === 'Phone'
    );
  }.property('model.communicationPreference'),

如果我在mode中使用它:

{{#if communicationPreferencePhone }}

效果很好。如何让communicationPreferenceIs更通用?

rnmwe5a2

rnmwe5a21#

你看过这个页面吗?全局帮助函数
要使用全局可用的helper函数,您需要将它们放置在app/helpers文件夹中。
在经典系统中,你会使用kebab-case来引用helper。
因此,
1.定义app/helpers/communication-preference-is.js

export default ....

1.通过{{communication-preference-is this.model "Phone"}}调用它,或者作为子表达式通过{{otherFunction (communication-preference-is this.model "Phone")}}调用它,就像在if语句中发生的那样:

{{#if (communication-preference-is this.model "Phone")}}

{{/if}}

语法说明:

  • {{ }}用于转义HTML
  • ( )用于子表达式(例如:调用通信首选项)
  • {{#块的开始
  • {{/块结束

空间上:

{{                     }} for escaping HTML
  #                       start of block
                as |  |   define local variables within the block
  /                       end of block
    (         )           sub expression
      (     )             sub expression (nested)

注意,在ember-source 4.5之前,helper必须 Package 在一个额外的函数helper

// app/helpers/communication-preference-is.js
import { helper } from '@ember/component/helper';

export default helper(function communicationPreferenceIs(positionalArgs, namedArgs) {
    let [model, type] = positionalArgs;

    return (
        model.communicationPreference &&
        model.communicationPreference.name === type
    );
});

email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)之后,你就可以

export default function communicationPreferenceIs(model, type) {
    return (
        model.communicationPreference &&
        model.communicationPreference.name === type
    );
}

使用Ember Polaris(3.28+支持),你可以导入helper而不是依赖全局变量:

import communicationPreferenceIs from 'app-name/helpers/communication-preference-is';

<template>
  {{communicationPreferenceIs @model "Phone"}}
</template>

但是,您可能需要一个app-name/helpers文件,您可以从中导入任何内容,而不是每个助手都有一个导入。

相关问题