用Angular4开发了一个小型的后台发布系统,遇到了很多经典功能的开发问题,整理出来以备后期查阅,也欢迎互相交流探讨更好的实现方案。

一 第一次进入页面正常,再刷新一下报404错误

解决方法:在app.module.ts中添加如下配置

providers: [
    LoginService,
    ArticleService,
    {
      provide: LocationStrategy,   //解决刷新后404的问题
      useClass: HashLocationStrategy //解决刷新后404的问题
    }
],

二 中间人组件通信的过程

组件间的通信分为两种情况:

  • 有共同父组件的通信
  • 无共同父组件在服务中通信

有共同父组件的通信就是两个组件有相同的父组件,A组件想和B组件通信,那么A组件可以将信息通过子组件->父组件(@output)传给公共的父组件P,然后父组件P再利用父子组件(@input)通信将信息传给B。具体的实现方法可以参考中间人组件通信

无共同父组件可以在服务中进行通信。具体的一个例子,搜索框在header组件中,文章列表在main组件中,我们通过公共的service来实现搜索框输入内容,main中的article-list组件内容更新。

先在service中定义一个EventEmitter

@Injectable()
export class ArticleService {
  searchEvent:EventEmitter<String> = new EventEmitter();
}

在Header组件中实现search方法如下

export class HomeHeaderComponent implements OnInit {
  searchCondition = "";
  constructor(
    private route: Router,
    private articleService: ArticleService
  ) { }
  ngOnInit() {
  }
  search() {
    this.articleService.searchEvent.emit(this.searchCondition);
  }
}

在main组件中订阅该事件

export class ArticleListComponent implements OnInit {
  public articleList:any;
  constructor(
    private articleService:ArticleService,
    private router: Router,
  ) { }
  ngOnInit() {
    this.articleService.searchEvent.subscribe(
      params => {
        this.articleService.searchArticle(params).then(
          result=> {
            this.articleList = result.data.articles;
          }
        );
      }
    );
  }
}

三 获得一组checkbox中哪个被选中的id

发布文章时要选择文章类别,用户通过勾选复选框进行文章类别选择,在发布时需要知道一组复选框中哪些被选中了。

<label class="checkbox-inline" *ngFor="let atype of typeArticle">
        <input type="checkbox" id="{{atype?.typeId}}" (change)="getTypeId(atype?.typeId,$event.target)">{{atype?.typeContent}}
</label>
getTypeId(id:string,target) {
    if(target.checked === true){
      $(target).parent('label').siblings().children("input:checkbox").each(function (item) {
         $(this).children("input:checkbox").attr("checked");
      });
      this.typeCheckedId = id;
    }else{
      this.typeCheckedId = "";
    }
  }

四 父组件调用子组件中的方法

在发布文章的组件中,有个子组件是编辑器组件,在发布文章的时需要获取编辑器组件中获取内容的方法,具体的实现方法如下,在父组件中声明子组件并添加@ViewChild,然后正常调用。

 @ViewChild('editor')
  private  editor:EditorComponent;
 getEditorContent():string {
    return this.editor.getEditorContent();
  }

五 绑定angular循环的内容到自定义属性上

attr.data-aid="{{item.aid}}"

六 编辑功能的实现

点击编辑按钮,对已发布的文章重新编辑,刚开始是准备用服务去实现,最后看了官网的示例,转换思路,用路由实现。在写的过程中,由于给每个a标签默认加上了href=‘#’,导致每次路由跳转的时候都跳转到跟路由的地方,这个地方花费了很长时间。

七 使用$("#id").modal('hide')关闭bootstrap的模态框时报错

报错信息 Property 'modal' does not exist on type 'JQuery<HTMLElement>'.

解决方法 在app.moudle.ts中引用import * as bootstrap from "bootstrap

PS: jquery的$之前也存在这样的问题,也需要引入import * as $ from 'jquery'

八 angular4的跨域问题

之前按照网上的步骤一步一步进行配置,发现总是404,起初先通过从后端通过cors来解决。

前端的解决方案的配置文件如下,在这里要注意/blog/*,之前一直配置成其他自定义的映射地址,但是后台项目的对应地址肯定是在http://localhost:8081/blog下,所以之前写的api映射地址会直接映射成http://127.0.0.1:8081/api,因此一直404,正确的修改如下:

 {
  "/blog/*":{
     "target":"http://127.0.0.1:8081",
     "secure":false,
     "logLevel":"debug"
  }
 } 
以上就是发布系统开发过程中angular常见的几大问题,很多问题都是第一次遇到,所以开发进度很慢,不过最后都能解决也是一件很快乐的事情。后续在扩展功能时也会不定时更新。


本文转载:CSDN博客