Angular:从控制器中隐藏组件[重复]

Posted

技术标签:

【中文标题】Angular:从控制器中隐藏组件[重复]【英文标题】:Angular: Hide component from controller [duplicate] 【发布时间】:2017-11-20 22:01:04 【问题描述】:

所以我是kAngularJS(1.6.4) 的新手。 我有一个组件,我想使用控制器以编程方式隐藏/显示。不幸的是,我不明白如何抓住我的组件,然后将 ng-hide 设置为 false。

现在,我的控制器在服务调用中看起来像这样。当数据返回时,我想运行我的隐藏/显示逻辑:

<div id="container" class="flex-container"><!-- flex container -->
  <div class="box" id="redbox" class="flex-item"><!-- flex item -->
    <input id="searchTermInput" class="search-input">
  </div>

  <div class="box" id="greenbox" class="flex-item"><!-- flex item -->
    <button id="searchButton" class="search-button" (click)="runSearch($event)">
    Search
    </button>
  </div>
  <hr  class="divider-line" ng-hide="dividerHider">
  <div class="flex-item search-results">
    <ul class="heroes">
      <li *ngFor="let result of searchResults">
        <span class="badge">result.id</span> result.title
      </li>
    </ul>
  </div>
</div>

.

import  Component  from '@angular/core';
import SearchService from "./search.service";
import SearchResult from "./search-result";

@Component(
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [SearchService]
)
export class AppComponent 
title = 'app';
searchResults: SearchResult[];
constructor(private searchResultService: SearchService)  
runSearch(ev): void 
var q = 100;

this.searchResultService.getHeroesSlowly().then(searchResults => 
    this.searchResults = searchResults;
    alert("Hello! I am an alert box!!" + this.searchResults.length);

    //Call hide component here
  
)

我已经完成了关于以编程方式隐藏内容的研究,但他们的代码似乎根本没有使用控制器。例如,在此回复中

AngularJS: ng-show / ng-hide

这里

AngularJS - ng-hide with different ng-controller

我完全不知道关于“$scope”的代码应该去哪里。

非常感谢任何帮助。

编辑:解决方案

我最终使用了这个结构。

...
<hr  id="divider" class="divider-line" *ngIf="showDivider">
...

export class AppComponent 
  showDivider = false;

  runSearch(ev): void 

    this.searchResultService.getHeroesSlowly().then(searchResults => 
        this.showDivider = true;
      
    )
  

【问题讨论】:

您的代码和模板使用 Angular 2+ 语法。 ng-hide 指令是 AngularJS (Angular 1.X)。 Scope 和 ng-hide 不是 Angular 2+ 的一部分。 代码导入@angular/core。那是 Angular 2+ 而不是 AngularJS 1.6.4。 正如问题所言,这根本不是重复的,因为它询问如何“以编程方式从控制器中隐藏”。链接的问题没有回答。 【参考方案1】:

看来您的问题是如何将 Angular 1.6 与 ES6 一起使用。也许这篇博文可以帮助您更好地了解如何使用 es6 为您的组件构建作用域。

https://nazargargol.com/scope-watch-with-angular-es6-class/

对于手头的任务,我可以推测(我没有使用 es6 语法,并且您没有可使用的 codepen 示例),将您的代码更改为:

this.searchResultService.getHeroesSlowly().then(searchResults => 
    this.searchResults = searchResults;
    alert("Hello! I am an alert box!!" + this.searchResults.length);

    //Call hide component here
    this.scope.show_results = true;
  
)

你的 html 到:

<div class="flex-item search-results" ng-show="show_results">
    <ul class="heroes">
      <li *ngFor="let result of searchResults">
        <span class="badge">result.id</span> result.title
      </li>
    </ul>
  </div>

应该做到这一点(提供,ofc,在构建组件时默认创建空范围,您可以向其中添加“search_results”)。

一般来说,ng-hide、ng-show、ng-if 使用的是 $scope 中定义的变量/方法,所以你需要构造正确的作用域。

【讨论】:

我尝试注入 $scope 变量,但它抱怨:未捕获的错误:无法解析 AppComponent 的所有参数:(?, [object Object])。除了英雄教程之外,我没有看到太多证据表明有人在使用 ES6 的东西。【参考方案2】:

您可以在第一次加载 html 内容时从角度代码中添加变量语句,例如 this.show_search = true;。然后在 searchResults 中,当您希望它更改时,您可以更改此变量(如果它可以从相同的 js 角度代码中读取)。我说的是下面的东西(假设你想隐藏搜索 div):

<div class="box" id="redbox" class="flex-item" ng-show="show_search">
   <input id="searchTermInput" class="search-input">
</div>

然后在 runSearch() 函数中将此 var 更改为 this.show_search = false;。那么你要隐藏的html内容就不会出现了。

另一种解决方案只是检查对象 searchResults 是否存在,并据此显示您的内容:

<div class="box" id="redbox" class="flex-item" ng-hide="searchResults">
   <input id="searchTermInput" class="search-input">
</div>

最后的解决方案:您还可以将变量初始化为 html 内容(以防您第一次加载的 html 内容在搜索后没有与相同的角度代码通信),然后使用它与第一个解决方案相同。如下:

<div id="container" class="flex-container" ng-init="show_search=true">
   <div class="box" id="redbox" class="flex-item" ng-show="show_search">
      <input id="searchTermInput" class="search-input">
   </div>
   .....
</div>

我的方法可能与您的代码有所不同,以防万一它不起作用,但这是主要思想。所以你可以检查如何调整它以适应你的结构。还要检查您的 html 内容是否与除服务之外的适当 js 角度控制器通信。这也将使您在设置新函数和变量方面变得更轻松。

当然,您可以使用 jquery,从 html 内容中读取您的 id 并将其隐藏:$("#searchTermInput").hide();

【讨论】:

以上是关于Angular:从控制器中隐藏组件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Angular 1.5 将数据从组件传递到控制器

模板中的Angular 2重复组件引用另一个元素

如何在 Angular 1.5 中从父控制器访问组件方法

隐藏静态表视图控制器中最后一个单元格下的空白行[重复]

Angular 5 - 将数据存储在服务而不是组件中?

如何在 Angular 1.5 组件中监听范围事件?