2015-01-02 33 views
2

我已经进入最新的Ember版本1.9.1和Handlebars 2.0.0版本。在这里,我收到了一个错误,如“使用Ember.Handlebars.get已弃用,请使用Component或Ember.Handlebars.makeBoundHelper”。如何获得handlebars注册助手的原始值?

我有这样的代码,

Handlebars.registerHelper('ifCond', function (temp_v1, operator, temp_v2, options) { // No I18N 

    var v1,v2; 
    v1 = Ember.Handlebars.get(this, temp_v1, options); 
    v2 = Ember.Handlebars.get(this, temp_v2, options); 

     if(v1 == undefined){ 
      v1 = temp_v1; 
     } 
     if(v2 == undefined){ 
      v2 = temp_v2; 
     } 


     switch (operator) { 
      case '==': 
      return (v1 == v2) ? options.fn(this) : options.inverse(this); 
      case '!=': 
      return (v1 != v2) ? options.fn(this) : options.inverse(this); 
      default: 
      return options.inverse(this); 
     } 
}); 

在这里,我需要检查给定的字符串值相等。如果我删除了Ember.Handlebars.get(this,temp_v1,options)中的“Handlebars”,那么弃用错误将消失。但我无法获得temp_v1的原始值。

JSBIN LINK:JSBIN LINK

+0

有点的建议:不使用在公顷任何逻辑运算ndlebars。它阻止你编写测试。 – saygun

+0

你有什么建议摆脱ifs?逻辑在哪里? – Nicolas

回答

1

用最小的修改发布的代码,一个可能的方案是沿着适当修改itemController设置为{{each}}帮手行,然后检索该控制器目标财产。

这种做法强烈夫妇itemController结构(即item财产和toString功能),哈佛商学院的模板结构(即item财产each助手中定义),它只要帮手保持独立是不是坏的,可重复使用的。

实施例,

http://emberjs.jsbin.com/geqezicaki/1/edit?html,js

HBS

<script type="text/x-handlebars" data-template-name="index"> 
    <ul> 
    {{#each item in model itemController="test"}} 
    {{#ifCond item '==' red}} 
     <li>{{item}}</li> 
    {{/ifCond}} 
    {{/each}} 
    </ul> 
    </script> 

JS

Handlebars.registerHelper('ifCond', function (temp_v1, operator, temp_v2, options) { // No I18N 

     var v1,v2; 
     //v1 = Ember.get(this, temp_v1, options); 
     //v2 = Ember.get(this, temp_v2, options); 
    v1 = options.data.view.get("controller").get(temp_v1); 
    v2 = options.data.view.get("controller").get(temp_v2); 

      if(v1 === undefined){ 
       v1 = temp_v1; 
      } 
      if(v2 === undefined){ 
       v2 = temp_v2; 
      } 


      switch (operator) { 
       case '==': 
       return (v1 == v2) ? options.fn(this) : options.inverse(this); 
       case '!=': 
       return (v1 != v2) ? options.fn(this) : options.inverse(this); 
       default: 
       return options.inverse(this); 
      } 
    }); 


App.TestController = Em.ObjectController.extend({ 
    item:Em.computed.alias("model"), 
    toString:function(){return this.get("item");} 
});