Xử lý khác nếu khác


241

Tôi đang sử dụng Handlebars.js để hiển thị chế độ xem phía máy khách. Nếu Else hoạt động tốt nhưng tôi đã gặp điều kiện 3 cách yêu cầu ELSE IF:

Điều này không hoạt động:

{{#if FriendStatus.IsFriend }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}

Làm cách nào để làm ELSE IF với tay lái?


Hãy theo dõi các bản cập nhật tay lái, có vẻ như nó sẽ được triển khai sớm: github.com/wycats/handlebars.js/pull/892
Jacob van Lingen

Câu trả lời:


376

Tay lái hỗ trợ {{else if}}các khối kể từ 3.0.0.

Tay lái v3.0.0 trở lên:

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else if FriendStatus.FriendRequested}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{else}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}

Tuy nhiên, trước Handbars v3.0.0, tuy nhiên, bạn sẽ phải xác định một trình trợ giúp xử lý logic phân nhánh hoặc các ifcâu lệnh lồng theo cách thủ công:

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else}}
  {{#if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
  {{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
  {{/if}}
{{/if}}

6
là điểm không có elsif (hoặc nếu không) trong các tay lái mà bạn đang đặt quá nhiều logic vào mẫu của bạn. Nói cách khác, bạn cần chia nó thành các mẫu nhỏ hơn?
Kazim Zaidi

1
@KazimZaidi, nếu bạn có một đoạn dữ liệu với hơn ba trạng thái yêu cầu định dạng khác nhau trong mỗi trường hợp thì sao? Bạn có thể buộc một kiểu CSS vào chính dữ liệu, nhưng sau đó bạn đang đẩy các mối quan tâm ở cấp độ xem vào dữ liệu của mình. Tôi có thể tưởng tượng các trường hợp hợp lý cho cấu trúc if / otherif / endif (hoặc thậm chí là một công tắc / khớp).
Drew Noakes

1
Nhìn vào điều này một lần nữa, tôi cảm thấy điều này có thể được thực hiện thông qua các ràng buộc thuộc tính.
Kazim Zaidi

1
Tôi nghĩ phương pháp ưa thích là truyền cờ boolean và điều kiện hóa chúng. Tùy thuộc vào bạn để đặt các cờ chính xác sao cho chỉ một điều kiện đánh giá là đúng. Không cần choelse if
chovy

Tôi khuyên bạn nên làm điều này với chức năng trợ giúp để tách logic kinh doanh của bạn khỏi bản trình bày.
Max Hodges

76

Tôi thường sử dụng mẫu này:

{{#if FriendStatus.IsFriend}}
  ...
{{else}} {{#if FriendStatus.FriendRequested}}
  ...
{{else}}
  ...
{{/if}}{{/if}}

Mẹo tốt, cảm ơn. Điều này sẽ được phản ứng theo mặc định?
kylemclaren

2
Ngoại hình khá với chỉ 1 else if, nhưng bạn càng có, còn mà danh sách cuối cùng của bế mạc nếu nhân được -{{/if}}{{/if}}{{/if}}{{/if}}{{/if}}
jbyrd

1
Không, nó không "sạch" hơn, nó xấu hơn.
gen b.

37

Tay lái hiện hỗ trợ {{else if}}kể từ 3.0.0. Do đó, mã của bạn bây giờ sẽ hoạt động.

Bạn có thể xem một ví dụ trong "điều kiện" (sửa đổi một chút ở đây với một bổ sung {{else}}:

    {{#if isActive}}
      <img src="star.gif" alt="Active">
    {{else if isInactive}}
      <img src="cry.gif" alt="Inactive">
    {{else}}
      <img src="default.gif" alt="default">
    {{/if}}

http://handlebarsjs.com/block_helpers.html


4
Đây sẽ là câu trả lời mới!
Saad Malik

không làm việc cho tôi (lỗi cú pháp trong mẫu). Sao băng 1.2.0.2
dragonmnl

@dragonmnl Phiên bản nào của Tay lái được sử dụng? Hãy chắc chắn rằng bạn đang sử dụng 3.0.
Don O

Tôi đang sử dụng phiên bản mặc định. Làm cách nào để kiểm tra phiên bản tay cầm?
dragonmnl

@dragonmnl Có vẻ như Meteor sử dụng ngôn ngữ mẫu riêng của mình được gọi là Spacebars . Nếu đó là trường hợp, thì tôi không chắc nó hỗ trợ {{else if}}cú pháp.
Don O

37

Tinh thần của tay lái là "không logic". Đôi khi điều này làm cho chúng ta cảm thấy như chúng ta đang chiến đấu với nó, và đôi khi chúng ta kết thúc với logic if / other lồng nhau xấu xí. Bạn có thể viết một người trợ giúp; nhiều người gia tăng tay lái với toán tử có điều kiện "tốt hơn" hoặc tin rằng nó phải là một phần của lõi . Tôi nghĩ, mặc dù, thay vì điều này,

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else}}
  {{#if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
  {{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
  {{/if}}
{{/if}}

bạn có thể muốn sắp xếp mọi thứ trong mô hình của mình để bạn có thể có thứ này,

{{#if is_friend }}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{/if}}

{{#if is_not_friend_yet }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{/if}}

{{#if will_never_be_my_friend }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}

Chỉ cần chắc chắn rằng chỉ có một trong những lá cờ này là đúng. Rất có thể, nếu bạn đang sử dụng điều này if/elsif/elsetrong quan điểm của mình, có lẽ bạn cũng đang sử dụng nó ở một nơi khác, vì vậy những biến này có thể không phải là thừa.

Giữ nó nạc.


1
Tôi không chắc thực tiễn của nó tốt như thế nào, nhưng hôm nay tôi đã xử lý 3 trạng thái chế độ xem khác nhau và cuối cùng tôi đã sử dụng một giải pháp dựa trên điều này (logic khác của họ không cần thiết vì tất cả đều kiểm tra chống lại một giá trị) stackoverflow.com/questions/15008564/ Vì vậy, thay vì #if _is_friend, bạn có thể sử dụng một chuỗi với một trình trợ giúp rất đơn giản (trong câu trả lời của họ); #if friend_type "is_friend" và #if friend_type "is_not_friend_yet"
Dylan Reich

Câu trả lời này là những gì tôi sẽ xem xét giải pháp xử lý tốt nhất trước 3.0, tôi nghĩ rằng HTML bổ sung tốt hơn so với việc cố gắng nhồi nhét logic vào Cây DOM.
David O'Regan

7

Tôi đã viết người trợ giúp đơn giản này:

Handlebars.registerHelper('conditions', function (options) {
    var data = this;
    data.__check_conditions = true;
    return options.fn(this);
});


Handlebars.registerHelper('next', function(conditional, options) {
  if(conditional && this.__check_conditions) {
      this.__check_conditions = false;
      return options.fn(this);
  } else {
      return options.inverse(this);
  }
});

Đó là một cái gì đó giống như mô hình Chuỗi trách nhiệm trong Tay lái

Thí dụ:

    {{#conditions}}
        {{#next condition1}}
            Hello 1!!!
        {{/next}}
        {{#next condition2}}
            Hello 2!!!
        {{/next}}
        {{#next condition3}}
            Hello 3!!!
        {{/next}}
        {{#next condition4}}
            Hello 4!!!
        {{/next}}
    {{/conditions}}

Nó không phải là một cái khác nếu nhưng trong một số trường hợp nó có thể giúp bạn)


1

Trợ giúp tích hợp

#if

Bạn có thể sử dụng if helper để tạo điều kiện một khối. Nếu đối số của nó trả về false, không xác định, null, "", 0 hoặc [], Tay lái sẽ không hiển thị khối.

bản mẫu

<div class="entry">
  {{#if author}}
    <h1>{{firstName}} {{lastName}}</h1>
  {{else}}
    <h1>Unknown Author</h1>
  {{/if}}
</div>

Khi bạn chuyển đầu vào sau vào mẫu trên

{
  author: true,
  firstName: "Yehuda",
  lastName: "Katz"
}

0

Xin chào, tôi chỉ có một chỉnh sửa tên lớp MINOR, và cho đến nay đây là cách iv tiết lộ nó. tôi nghĩ rằng tôi cần phải truyền các tham số đa biến cho người trợ giúp,

server.js

app.engine('handlebars', ViewEngine({
        "helpers":{
                isActive: (val, options)=>{
                    if (val === 3 || val === 0){
                        return options.fn(this)
                    }
                } 
        }
}));

tiêu đề.handlebars

<ul class="navlist">
          <li   class="navitem navlink {{#isActive 0}}active{{/isActive}}"
                ><a href="#">Home</a></li>
          <li   class="navitem navlink {{#isActive 1}}active{{/isActive}}"
                ><a href="#">Trending</a></li>
          <li   class="navitem navlink {{#isActive 2}}active{{/isActive}}"
                ><a href="#">People</a></li>
          <li   class="navitem navlink {{#isActive 3}}active{{/isActive}}"
                ><a href="#">Mystery</a></li>
          <li class="navitem navbar-search">
            <input type="text" id="navbar-search-input" placeholder="Search...">
            <button type="button" id="navbar-search-button"><i class="fas fa-search"></i></button>
          </li>
        </ul>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.