如何从 afterModel 或一些类似的方法更改 emberJS 中 HTML 元素的属性

How to change the attributes of a HTML element in emberJS from the afterModel or some similar method

我的 ember 应用程序中有一个路由和一个相应的模板。在页面加载本身上,我想根据 URL 参数隐藏一些元素。我尝试使用 jquery $.("elementName").hide(); 和其他一些组合在 afterModel 方法中执行此操作。但是没有任何效果,因为 DOM 似乎还不可用。可以通过操作部分中的按钮操作实现相同的效果,但它对我没有帮助,因为我想在页面加载时执行此操作。谁能指出我做错了什么。

你的 URL 参数 queryParams 在路线上吗?如果是这样,您可以在您的控制器上设置属性以检查它们的存在(或任何其他真实条件)并在您的模板中利用它们用于 DOM 显示目的。您甚至可以将这些值发送到子组件。

routes/index.js

queryParams: {
  q: {
    refreshModel: true
  },
  colors: {
    refreshModel: true
  }
}

controllers/index.js

q: '',
colors: [],
hasSearch: Ember.computed.notEmpty('q'), 
hasColors: Ember.computed.notEmpty('colors')

templates/index.hbs

{{#if hasSearch}}
  <p>You are searching for {{q}}</p>
{{/if}}
// .. etc for colors

正确的方法是使用 ember 和车把 {{#if}} 助手。如果将它与 queryParams 结合起来,它非常简单:

您的控制器可能如下所示:

export default Ember.Controller.extend({
  queryParams: ['showSomething'],
});

你的模板是这样的:

<h1>Hello</h1>
{{#if showSomething}}
  <div id="something">something</div>
{{/if}}

如果您真的想要手动操作 DOM,您可以在 didInsertElement 挂钩中执行此操作。但是,您 仅在一个组件中 :

所以 my-component.hbs 看起来像这样:

<div id="{{concat elementId "something"}}>something</div>

和你的my-component.js

export default Ember.Component.extend({
  didInsertElement() {
    this._super();
    if(false) {
      $(`#${this.get('elementId')}something`).hide();
    }
  }
});

但是,我强烈反对!