2012-06-29 77 views
13

Tôi có một đối tượng điều khiển đó là như:Có thể sử dụng chức năng trong Handlebars #if không?

MyApp.objController = Ember.ArrayController.create({ 
    init: function(data) { 
    data.isValid = function() { 
     return (data.validity === "valid"); 
    } 
    this.pushObject(MyApp.MyObj.create(data)); 
    } 
}); 

Quan điểm của tôi là như sau:

{{#each MyApp.objController}} 
    {{#if isValid}} 
    <some markup> 
    {{else}} 
    <some other markup> 
    {{/if}} 
{{/each}} 

tôi đã giả định rằng if có điều kiện trong tay lái chấp nhận cả giá trị và chức năng, nhưng điều này dường như không là trường hợp. Có thực sự có thể, và tôi chỉ làm sai?

Trả lời

5

Nếu bạn xác định isValid bạn như là một property, bạn có thể sử dụng nó trong bản Tuyên Bố if của bạn mà không cần tạo một helper tùy chỉnh tay lái, xem http://jsfiddle.net/pangratz666/Dq6ZY/:

tay lái:

<script type="text/x-handlebars" data-template-name="obj-template" > 
    {{view Ember.TextField valueBinding="age" }} 
    {{#if isValid}} 
     Si Si. 
    {{else}} 
     Nope! 
    {{/if}} 
</script>​ 

Javascript:

App.MyObj = Ember.Object.extend({ 
    isValid: function() { 
     return this.get('age') >= 18; 
    }.property('age') 
}); 

Ember.View.create({ 
    templateName: 'obj-template', 
    controller: App.MyObj.create({ 
     age: 21 
    }) 
}).append(); 

+0

Ngọt ngào! Cảm ơn! Hoạt động tốt hơn phương pháp của tôi khi sử dụng thuộc tính 'đã tính toán ' – Jay

-1

Bạn có thể tạo trình trợ giúp Handlebars tùy chỉnh để thực hiện việc này.

+0

Tôi đã hy vọng cho một chút chi tiết hơn ... Tôi đã không làm bất cứ điều gì với Handlebars trong một tháng vì vậy tôi đã quên hầu hết những gì tôi biết: P. Sẽ trở lại và chấp nhận điều này khi tôi quay trở lại phần đó của dự án của tôi và thử nó. – Jay

5

Tay lái nếu câu lệnh chỉ so sánh nếu giá trị tồn tại, nếu đó là giá trị giả (tức là không tồn tại, 0, một chuỗi trống, v.v.). Bạn phải viết một hàm trợ giúp tùy chỉnh.

Bạn có thể làm điều đó như thế này

Handlebars.registerHelper('isValid', function (value, options) { 
    if (value == "valid") { 
     return options.fn(this); 
    } 
    return options.inverse(this); 
}); 

này đăng ký một helper khối. Nếu giá trị bạn vượt qua được đánh giá là "hợp lệ", nó trả về mẫu sau trình trợ giúp với dữ liệu hiện tại. Nếu nó không đánh giá hợp lệ, nó sẽ trả về mẫu sau câu lệnh khác với dữ liệu hiện tại.

Sau đó, trong mẫu của bạn, bạn có thể sử dụng nó như thế này

{{#each MyApp.objController}} 
    {{#isValid validity}} 
     <some markup> 
    {{else}} 
     <some other markup> 
    {{/isValid}} 
{{/each}} 

Ngược lại, nếu bạn muốn tuân theo tinh thần của tay lái và làm mẫu 'logic ít', thiết lập một lá cờ trước khi bạn làm cho mẫu cho biết dữ liệu đó có hợp lệ không, sau đó sử dụng các tay lái nếu helper với cờ.

Bạn cũng có thể thiết lập chức năng chung để xử lý trường hợp này và các trường hợp khác. Xem câu trả lời của tôi trong Logical operator in a handlebars.js {{#if}} conditional cho một ví dụ cho một generic if (tương tự như câu trả lời ở trên)

+0

Có vẻ như trong Ember 1.5.1+ đây không còn là một lựa chọn nữa. – jevon

+0

Kết thúc bằng '{{/ if}}' không hoạt động đối với tôi, nhưng kết thúc bằng '{{/ isValid}}' đã làm. Không chắc chắn nếu điều này là bởi vì đây là 2,5 năm sau đó hoặc những gì, nhưng chỉ muốn ném nó ra khỏi đó. – Galen

+0

Vâng, đây là lỗi đánh máy. Đã sửa. –

-3

Hãy thử điều này:

<ul> 
    {{#each subsites}} 
     {{#if this}} 
     <li>{{{WhatIsTheSiteFor this}}}</li> 
     {{else}} 
     <li>no found</li> 
     {{/if}} 
    {{/each}} 
</ul> 

đây là chức năng helper cho WhatIsTheSiteFor:

  Handlebars.registerHelper('WhatIsTheSiteFor', function(sitename) { 
      var subsitename = '', 
      sitenamestr = ''; 
      $.each(sitename, function(i, item){ 
        sitenamestr += item; 
        return sitenamestr; 
      }); 
      if(sitenamestr==='s.gbin1.com'){ 
      subsitename = '<a href="http://'+ sitenamestr +'">GB搜索引擎</a>'; 
      }else if(sitenamestr==='m.gbin1.com'){ 
      subsitename = '<a href="http://'+ sitenamestr +'">GB手机阅读</a>'; 
      }else if(sitenamestr==='rss.gbin1.com'){ 
      subsitename = '<a href="http://'+ sitenamestr +'">RSS消息订阅</a>'; 
      } 
      return subsitename; 
     }); 

Dưới đây là bản demo: http://www.gbin1.com/gb/networks/uploads/71bb1c1e-0cd3-4990-a177-35ce2612ce81/demo6.html

+0

Mã không được định dạng và không có ngữ cảnh. Sẽ hữu ích nếu giải thích được thêm vào. – Jeanno

Các vấn đề liên quan