【问题标题】:How can I have links which do different things in Backbone.js without using eval()?如何在不使用 eval() 的情况下在 Backbone.js 中获得执行不同操作的链接?
【发布时间】:2011-11-21 08:37:17
【问题描述】:

我有链接,我想根据链接做不同的事情。因此我有一个数据结构:

var data = [{"name":"foo", "onClick":"baz()"}, {"name":"bar", "onClick":"bam()"}];

目前,在视图中,我有一个函数运行,它获取项目并执行 eval(item.onClick),并且有效,只是感觉像一个安全漏洞。 我可以在渲染视图时将 onClick 放入 html,但感觉不对。

有谁知道这样做的方法吗?

【问题讨论】:

    标签: javascript jquery backbone.js


    【解决方案1】:

    你可以在数据中嵌入函数

    var data = [{"name":"foo", "onClick":baz}, {"name":"bar", "onClick":bam}];
    item.onClick();
    

    您可以查看here 以获取更多有用的信息

    【讨论】:

    • 这可能不会改变可能的安全问题,但它确实有效。但只要您可以信任来源,两者都不存在安全风险,只是不要评估用户可能输入的任何内容。
    【解决方案2】:

    主干视图有一个delegateEvents function:

    var MyView = Backbone.View.extend({
    
      events: {
        "click button[name='foo']": "baz",
        "click button[name='bar']": "bam"
      },
    
    
      baz: function(){ ... }
    
      bam: function(){ ... }
    

    【讨论】:

    • 这个问题是它不允许数据驱动的方法
    【解决方案3】:

    简单——即使您没有为函数调用实现对象容器。

    function baz(){ 
        ....
    }
    function bam(){ 
        ....
    }
    

    并且,假设你有这个作为你的 JSON 回调:

    function jsonCallback(data){
        /*some code*/
        window[data.onClick]();
        /* some more code */
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-17
      • 2020-03-13
      • 2017-12-10
      • 1970-01-01
      • 2023-03-31
      • 2018-06-07
      • 1970-01-01
      • 2020-09-29
      相关资源
      最近更新 更多