如何获得车把登记助手的原始值?

时间:2015-01-02 10:12:57

标签: ember.js handlebars.js

我已进入最新的Ember版本1.9.1和Handlebars版本2.0.0。在这里,我得到一个错误,例如"不推荐使用Ember.Handlebars.get,而是使用Component或Ember.Handlebars.makeBoundHelper。"

我有这样的代码,

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);
        }
 });

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

JSBIN LINK:JSBIN LINK

1 个答案:

答案 0 :(得分:1)

对发布的代码进行最少的修改,可能的解决方案可能是将正确修改的itemController设置为{{each}}帮助程序,然后从此控制器检索目标属性。

此方法将itemController结构(即item属性和toString函数)强烈耦合到hbs模板结构(即item属性中定义的each属性1}} helper),只要帮助程序保持独立且可重用,就没那么糟糕。

实施例,

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");}
});