2017-10-05 80 views
0

我有我的这样的JavaScript代码。里面,我有一个init()函数,并在该函数中我有一个选项JSON对象,并在该对象中,我有一个函数定义为objectselected()。我如何调用该函数在一个按钮单击事件从外部范围调用私有/嵌套的JavaScript函数

我已经试过这样WorkFlow.init()。options.Objectselected(),但它不工作,

var WorkFlow = { 
connectionData: [], 
    selectedTouchpoints: [], 
    init: function() { 
     var options = { 
      palleteId: "myPaletteElement", 
      elementId: "playAreaContainer", 
      TextStoreList: ['One', 'Two', 'Three'], 
      LinkTextStoreList: $('#drpLinkType option').map(function() { 
       return this.text; 
      }).get(), 
      shapeList: ['RoundedRectangle', 'Circle', 'Rectangle', 'Ellipse', 'Square', 'Diamond', 'Card', 'Database'], 
      diagramUpdate: function (e) { 

      }, 
      objectSelected: function (e) { 
      }, 

      linkUpdate: function (e) { 

      }, 
      initialize: function() { 

       } 



     myGraph = new Graph(options); 
     options.initialize(); 
    }, 
} 

如何调用该函数。

+1

因为'options'是在其范围内私有变量,你不必给它的外部访问。还要注意这个问题与jQuery或JSON无关。 – Utkanos

+0

'init()'不会返回任何东西,所以你不能执行'init()。options' –

+1

你不能在json字符串中使用函数 – madalinivascu

回答

0

您需要返回options,因为它是内部初始化函数的范围

var WorkFlow = { 
    connectionData: [], 
     selectedTouchpoints: [], 
     init: function() { 
      var options = { 
       palleteId: "myPaletteElement", 
       elementId: "playAreaContainer", 
       TextStoreList: ['One', 'Two', 'Three'], 
       LinkTextStoreList: $('#drpLinkType option').map(function() { 
        return this.text; 
       }).get(), 
       shapeList: ['RoundedRectangle', 'Circle', 'Rectangle', 'Ellipse', 'Square', 'Diamond', 'Card', 'Database'], 
       diagramUpdate: function (e) { 

       }, 
       objectSelected: function (e) { 
       }, 

       linkUpdate: function (e) { 

       }, 
       initialize: function() { 

       } 

      myGraph = new Graph(options); 
      options.initialize(); 
      return options; 
     }, 
    } 

并把它作为WorkFlow.init().objectSelected();

+1

我可以知道-1 –

+0

的理由Hi @Utpal,请让我知道如果这对你有用 –

+0

我还没有给你-1 – Utpal

0

一种方法是左右可以回到选项,比调用它。

init: function() { 
     var options = { 
      ...your code..} 
     return options; 
    }, 

,并把它比

var options = WorkFlow.init(); 
options.Objectselected(); 
+0

解决方案的问题是我已经在我的document.ready中调用了init,所以当我第二次调用它时它会发生错误,因为绑定在那里 – Utpal

0

大厦帕特里克的评论,你需要从init函数返回options

var WorkFlow = { 
connectionData: [], 
    selectedTouchpoints: [], 
    init: function() { 
     var options = { 
      palleteId: "myPaletteElement", 

      ...  

     options.initialize(); 
     return options;    
    }, 
} 
0

既然这样,你没有访问到options,因为它是一个局部变量 - 即在其范围内是局部变量。

要访问它的内容,您需要从init()返回它的内容。

想想看:

WorkFlow.init() 

目前这款返回undefined,因为你的init()回报什么。你试图像jQuery那样链接,但依赖于API总是返回实例。你的路径在init()找到一个死胡同。

要解决这个问题,请init()返回options - 或者至少要从外部访问它的一部分 - “导出”。

所以(基本的例子)

init: function() { 
    var options { 
     my_func: function() { }, //<-- we want outside access to this 
     private: 'blah' //<-- this can stay private - leave it out of the export 
    } 
    //return an export, exposing only what we need to 
    return { 
     my_func: options.my_func 
    } 
}