在字符串插值中使用Elixir在我的模板中无法正常工作

时间:2016-10-14 10:43:46

标签: elixir phoenix-framework

我正在渲染一个模板并将一些选项传递给它。在其中一个我有这个代码:

export const AppRoutes: Routes = [
  ...
  { 
    path: '/one',
    component: OneComponent,
    resolve: {
      foo: 'foo'
    }
  }
];

我发现只有@Component() export class OneComponent implements OnInit { foo; constructor(private route: ActivatedRoute) {} ngOnInit() { this.foo = this.route.snapshot.data['foo']; } } 内的第二个代码执行,如果我复制第一个func getAllMangaPage() -> Observable<String>{ return Observable.create { observer in var urls :[String] = [] let subs = self.repeatEvery(second: 0.2) .subscribe { event in if urls.isEmpty { urls.append(self.popularMangaInitialUrl()) }else{ self.getNextPageUrl(currentStringUrl: urls.last!) .subscribe( onNext: { url in var nextUrl = url as String if !nextUrl.contains("http://") { let completeUrl = "\(self.popularMangaInitialUrl())\(nextUrl)" if !urls.contains(completeUrl){ urls.append("\(self.popularMangaInitialUrl())\(nextUrl)") observer.onNext(urls.last!) } }else{ if !urls.contains(nextUrl){ urls.append(nextUrl) observer.onNext(urls.last!) } } }, onCompleted: { }, onDisposed: { } ) } } return Disposables.create { print("Disposed") subs.dispose() } } } 并在第二个main: "#{ @comp[:contentItem] unless Regex.match?(~r/width:/, to_string @comp[:contentItem]) do "width: 165px;" end unless Regex.match?(~r/height:/, to_string @comp[:contentItem]) do "height:65px;" end }" 之后重复它,那么似乎有一个在unless之后立即运行代码的问题 我尝试过使用unless和其他组合而没有运气。

1 个答案:

答案 0 :(得分:3)

如果在这样的字符串插值中添加多个代码块,则忽略除最后一个之外的所有代码块。 Elixir也会对此显示警告(可能eex没有):

iex(1)> "#{1
...(1)> 2
...(1)> 3}"
warning: code block contains unused literal 1 (remove the literal or assign it to _ to avoid warnings)
  iex:1

warning: code block contains unused literal 2 (remove the literal or assign it to _ to avoid warnings)
  iex:1

"3"

修复是使用3个单独的插值。对于您的代码,这应该有效:

main: "#{@comp[:contentItem]}\
#{unless Regex.match?(~r/width:/, to_string @comp[:contentItem]) do "width: 165px;" end}\
#{unless Regex.match?(~r/height:/, to_string @comp[:contentItem]) do "height:65px;" end}"

我最后使用\来确保在3个表达式之间没有插入额外的空格。

编辑:正如@cdegroot指出的那样,将这种复杂的逻辑添加到模板被认为是一种可怕的做法。您应该在相关视图,控制器,模型或单独的模块中执行此计算。它被认为是拥有尽可能简单模板的最佳实践,通常只是循环并打印出分配/地图/结构的字段。