Javascript 把手#每个循环内动作辅助对象的范围

Javascript 把手#每个循环内动作辅助对象的范围,javascript,ember.js,handlebars.js,Javascript,Ember.js,Handlebars.js,我对{{#each}}块中的作用域感到困惑 如果我有车把脚本 <script type="text/x-handlebars"> {{#each vars}} <button {{action foo}}> {{name}} </button> {{/each}} </script> 脚本可以很好地看到{{name}并将其作为按钮的标题,正如您所期望的那样,但是操作不会绑定到数组成员中定义的foo函数 有没有什

我对{{#each}}块中的作用域感到困惑

如果我有车把脚本

<script type="text/x-handlebars">
      {{#each vars}}
      <button {{action foo}}> {{name}} </button>
      {{/each}}
</script>
脚本可以很好地看到
{{name}
并将其作为按钮的标题,正如您所期望的那样,但是操作不会绑定到数组成员中定义的
foo
函数

有没有什么方法可以做到这一点,而我却没有,或者我需要重构以使
foo
直接在
ApplicationController
中定义?


这可能是由于根元素造成的,请检查此处的发布以了解更多信息

您可以在
ApplicationController
上设置事件,并传入单个对象并调用存储的
foo()
。在
{{{each vars}}…{{/each}
块内,您可以使用
this
将实际对象传递给事件处理程序

JS:

App.ApplicationController = Ember.Controller.extend({
    vars: Ember.ArrayController.create({
        content: [
            {   name: "Cow",
                foo: function(){console.log("moo");}
            },
            {   name: "Cat",
                foo: function(){console.log("meow");}
            }
        ]
    }),
  doFoo: function(obj) {
    obj.foo();
  }
});
{{#each vars}}
      <button {{action doFoo this}}> {{name}} </button>
{{/each}}
把手:

App.ApplicationController = Ember.Controller.extend({
    vars: Ember.ArrayController.create({
        content: [
            {   name: "Cow",
                foo: function(){console.log("moo");}
            },
            {   name: "Cat",
                foo: function(){console.log("meow");}
            }
        ]
    }),
  doFoo: function(obj) {
    obj.foo();
  }
});
{{#each vars}}
      <button {{action doFoo this}}> {{name}} </button>
{{/each}}
{{#每个变量}
{{name}}
{{/每个}}

这就是我最后要做的,我只是想知道这是否完全必要。你也可以去掉
Ember.ArrayController
并将
vars
设置为一个数组。我认为你不能在那些内部的
foo
方法上使用
{{action}
,因为它们不是视图、控制器或可以接受事件的路由器……你可以在数组上循环,但以后不能添加,所以我只是习惯于使用ArrayController你应该能够添加/修改它们。Ember修改默认的
数组
,并添加扩展其功能的mixin,因此您可以使用
pushObject
和其他帮助程序以Ember跟踪绑定的方式修改数组。