Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Ember.js的动作助手传递参数?_Javascript_Ember.js_Handlebars.js - Fatal编程技术网

Javascript 如何使用Ember.js的动作助手传递参数?

Javascript 如何使用Ember.js的动作助手传递参数?,javascript,ember.js,handlebars.js,Javascript,Ember.js,Handlebars.js,我有一个项目清单: <ul> {{#each applications}} <li> <a {{bindAttr href="url"}} {{action "appClicked" on="click"}}> {{name}} </a> </li> {{/each}} </ul&

我有一个项目清单:

  <ul>
    {{#each applications}}
      <li>
        <a {{bindAttr href="url"}} 
        {{action "appClicked" on="click"}}>                
           {{name}}
        </a>
      </li>
    {{/each}}
  </ul>
    {{{#每个应用程序}
  • {{/每个}}
单击时,它调用此模板所属视图的方法
appClicked
。我想将一些信息(例如,应用程序的名称)传递给方法
appClicked
。类似于,
{{action“appClicked(name)”on=“click”}


是否可能,以及如何实现?

您可以尝试将参数设置为
  • 或的属性
  • {{/每个}} //在js代码中 appClicked:函数(事件){ //您可能需要反复查看并检查哪个DOM元素 //具有param属性。从内存中它是父级。 var param=this.$().parent().attr('param'); ... }
    我一直在想一些与此相关的东西,因为您可以通过实际视图访问更多内容。但是扎克,如果你能解释一下,如果这不是你想要的,你到底想做什么

    App=Ember.Application.create();
    App.peopleController=Ember.ArrayController.create({
    内容:[{name:'Roy',url:'#'},
    {姓名:'迈克',网址:'#'},
    {姓名:'露西',网址:'#'}]
    });
    App.PersonView=Ember.View.extend({
    标记名:“li”,
    内容:空,
    linkClicked:function(){
    log(this.getPath('content.name');
    }
    });
    
      {{{#每个App.peopleController} {{{#view App.PersonView contentBinding=“this”} {{/view} {{/每个}}
    从子视图中,您可以附加数据属性并在控制器中访问它们

    例如,在您的视图中,如果您有:

    {{#view Ember.Button target="App.controller" action="publish" data-publish=false}}Unpublish{{/view}}
    
    然后在控制器中

    App.controller = Ember.Object.extend({
      publish: function(v){
        var status = v['data-publish'];//your additional information is appended to the view.
      }
    }
    

    Veeb答案的一个改进是,记住您有jQuery事件,因此您可以执行以下操作:

    // template
    <ul>
      {{#each applications}}
        <li>
          <a {{bindAttr href="url"}} param="abc" {{action "appClicked" on="click"}}>
             {{name}}
          </a>
        </li>
      {{/each}}
    </ul>
    
    // In your js code
    appClicked: function (event) {
        var param = $(event.target).attr('param');
        ...
    }
    
    //模板
    
      {{{#每个应用程序}
    • {{/每个}}
    //在js代码中 appClicked:函数(事件){ var param=$(event.target).attr('param'); ... }
    显然,余烬现在已经进化,可以将参数传递给动作:

    {{action "functionName" parameter}}
    
    在您的情况下,这将是:

    <a {{bindAttr href="url"}} 
       {{action "appClicked" name on='click'}}>                
           {{name}}
       </a>
    
    
    
    但是,您可以传递模型中的任何属性(如id),而不是名称

    有关更多信息,请参阅。

    您可以传入多个参数

    html和把手:

    {{officename}} 
    <button {{action "actionTest" "hello" "goodbye" officename}}>See parameters through action in the console</button>
    

    目前还没有一种方法可以做你想做的事情,我认为这样做听起来不太正确。我知道这只是您尝试执行的任何操作的一小部分,但您不需要将
    name
    属性(或任何相关属性)传递给您的操作。目标应该是列表中的当前视图。你能提供一个JSFIDLE,也许再解释一下你想解决什么问题吗?这里可以从我看到的解决方案的API中找到答案,在某处(由Katz回答)。据我所知,您必须为要跟踪事件的每个元素(单击、焦点等)创建单独的视图。我说得对吗?我也发现了这个拉力,不确定这是否是我要找的。我也解释了一下,是的,你是对的。使用常规视图呈现非常大的列表时存在一些性能问题(我认为这是#collection helper被贬低的原因之一)。但是,如果您看看我的解决方案,我会将子视图更改为变态视图,这几乎消除了#collection和#each helpers之间的性能差异。无论如何,这是你应该做的。我不会太担心这个pull-req,我已经在这个答案中创建了一个JSFIDLE版本,它兼容Ember 1.0并且是惯用的。Roy,请随时使用此链接更新您的答案:从Ember 1.0版本开始,此JSBin不再运行。您可能需要更新它@HaoQu Li
    {{officename}} 
    <button {{action "actionTest" "hello" "goodbye" officename}}>See parameters through action in the console</button>
    
    actionTest: function(a, b, c){
       console.log(a);
       console.log(b);
       console.log(c);
    },