2016-10-20 6 views
0

Я пытаюсь вызвать метод объекта, id которого объявлен и определен внутри другого блока AMDjs. Вот пример кода:Вызов метода объекта из другого блока AMDjs?

первый блок:

require(
 
[ 
 
    "dojo/ready", 
 
    "dojo/store/Memory", \t \t \t \t 
 
    "cbtree/Tree", \t \t \t \t \t \t 
 
    "cbtree/model/TreeStoreModel", \t 
 
    "dojo/dom-class", 
 
    "dojo/domReady", 
 
    "dijit/form/CheckBox", 
 
    "dojo/domReady!" 
 
], 
 
function 
 
(
 
    ready, 
 
    Memory, 
 
    Tree, 
 
    ObjectStoreModel, 
 
    domClass, 
 
    CheckBox 
 
) 
 
{ 
 

 
    var XTree = function() 
 
    { 
 
     this.store = new Memory({ data: this.datax() }); 
 

 
     this.model = new ObjectStoreModel(
 
     { 
 
      store: this.store, 
 
      query: { id: "all" }, 
 
      rootLabel: "xxx", 
 
      checkedRoot: true 
 
     }); 
 
    } 
 

 
    XTree.prototype.applyTheTree = function() 
 
    {     
 
     this.tree = new Tree({ model: this.model, id: "tree00", animation: false }, "treeViewx"); 
 
     this.tree.startup(); 
 
    } 
 

 
    XTree.prototype.fire = function() 
 
    { 
 
     alert('fire'); 
 
    } 
 

 
    XTree.prototype.datax = function() 
 
    { 
 
     return [ 
 

 
        { id: 'all', name:'' }, 
 
         { id: 'br1', name:'branch 1', parent: 'all' }, 
 
          { id: '1', name:'b 1', parent: 'br1' }, 
 
        { id: '1', name:'b 2', parent: 'all' } 
 
       
 
       ] 
 
    }; 
 
    
 

 
    var xTree = new XTree(); 
 
    
 

 
    ready(function() 
 
    { 
 
     xTree.applyTheTree(); 
 
       
 
    }); 
 

 
    return xTree; 
 
    
 
});

Я пытаюсь ссылаться на объект из другого блока, как это внутри второго блока:

define([ .. 'XTree' ], function(.. xTree) 
 
{ 
 
    ... 
 
    
 
    var btnX = document.createElement('input'); 
 
     btnX.type = 'button'; 
 
     btnX.value = 'hey'; 
 
     btnX.style.width = '90px'; 
 
     btnX.style.height = '25px'; 
 
     btnX.onclick = function () { xTree.fire() }; 
 
    ... 
 
});

  • Почему нажатие кнопки x Дерево «не определено» вместо того, чтобы запускать метод fire()?

ответ

0

Вы используете require и define в обратном порядке.

Используйте define, чтобы определить модуль, который может быть использован другим кодом. Как правило, define будет использоваться в файле javascript.

Используйте require, если вы не определяете модуль, но вам нужны модули, которые были определены. Как правило, требование будет использоваться в HTML-страницах. HTML-страница не является модулем, но требует, чтобы модули отображали страницу пользователю.

Также старайтесь избегать использования прототипа при использовании додзе. вы можете использовать 'dojo/_base/declare' для создания конструктора модуля.

define([ "dojo/ready", 
    "dojo/_base/declare", 
    "dojo/store/Memory",    
    "cbtree/Tree",       
    "cbtree/model/TreeStoreModel",  
    "dojo/dom-class", 
    "dojo/domReady", 
    "dijit/form/CheckBox", 
    "dojo/domReady!" 
], function(ready, 
    declare, 
    Memory, 
    Tree, 
    ObjectStoreModel, 
    domClass, 
    CheckBox){ 


    var XTree = declare(null, { 

     constructor: fuction(){ 
      this.store = new Memory({ data: this.datax() }); 
      this.model = new ObjectStoreModel({ 
       store: this.store, 
       query: { id: "all" }, 
       rootLabel: "xxx", 
       checkedRoot: true 
      }); 
     }, 

     applyTheTree : function(){     
      this.tree = new Tree({ model: this.model, id: "tree00", animation: false }, "treeViewx"); 
      this.tree.startup(); 
     }, 

     fire : function(){ 
      alert('fire'); 
     }, 

     datax = function(){ 
      return [{ id: 'all', name:'' }, 
       { id: 'br1', name:'branch 1', parent: 'all' }, 
       { id: '1', name:'b 1', parent: 'br1' }, 
       { id: '1', name:'b 2', parent: 'all' }] 
     } 
    }); 

    var xTree = new XTree(); 
    ready(function(){ 
     xTree.applyTheTree(); 
    }); 

    return xTree; 
}); 

Теперь вы возвращаете экземпляр объекта, а не конструктор. Таким образом, вы пытаетесь создать модуль singleton. Это верно?

Также убедитесь, что путь к модулю, требуя в другом модуле или требуемый метод, является правильным. Если вы получаете исключение Undefinded Module в консоли, тогда возникает проблема.

Надеюсь, это было полезно.

+0

Похоже, что по какой-то причине на данный момент я ссылаюсь на блок в своем дополнительном модуле - он дважды передает конструктор. –

+0

Недостающая часть была сама по себе. Работает как шарм! –