2013-03-18 8 views
8

Ich bin vertraut mit Rückgrat-Anwendungen bauen, aber ich versuche, es zu konvertieren requirejs zu verwenden, das Problem, das ich bin vor, wenn ich versuche, die übergeordnete Ansicht zu erweitern, ist es undefinedBackbone sieht nicht in der Lage zu erweitern requirejs mit

wenn man versucht, Basis-view.js zu Immobilien-view.js

define(['backbone','underscore','jquery','views/node/base-view'],     
    function(Backbone, _, $, NodeBaseView){ 
    PropertiesView = NodeBaseView.extend({ 

     }); 
    } 
}); 

Instanziieren ein Kind Blick in den übergeordneten Basisansicht

define(['backbone','underscore','jquery','views/node/properites-view'], function(Backbone, _, $, PropertiesView){ 
    NodeBaseView = Backbone.View.extend({ 
    .. 
     new PropertiesView({}); 
    .. 
    }); 

}); 

Hier zu erweitern NodeBase View ist undefined, wenn versucht wird, es für PropertiesView zu erweitern. Irgendeine Hilfe?

Hinweis: Ich bin mit AMD-Versionen von Rückgrat und unterstreichen von hier https://github.com/amdjs

+0

Sind Sie sicher, dass Sie die Ansicht sind Rückkehr? wie in 'NodeBaseView zurückkehren;' am Ende. – rednaw

+1

möglich, das war die Lösung. Ich habe diesen Fehler vor mehr als sechs Monaten gelöst und kann mich jetzt nicht erinnern. –

Antwort

3

Das Problem hier scheint eine zirkuläre Abhängigkeit zu sein. Die Basisansicht erfordert die Eigenschaftenansicht und umgekehrt. Dies führt dazu, dass einer von ihnen undefiniert ist.

+0

Ich verstehe das. Bei der regulären Version von Backbone tritt dieses Problem jedoch nicht auf, und das Erweitern von Ansichten ist eine der Funktionen. Irgendeine Idee, wie ich das hier beheben kann –

+2

Nun, um klar zu sein, es sei denn, ich habe die Frage völlig missverstanden, das Problem, das Sie erleben, hat nichts mit Backbone zu tun. Es geht eher darum, wie du es benötigst. Kreisförmige Abhängigkeiten sind in AMD nicht erlaubt. (Jemand korrigiert mich, wenn ich falsch liege.) Selbst wenn Sie nicht "require" verwenden, erscheint es mir seltsam, dass eine Elternansicht von einer Kindansicht abhängt. Ich versuche nicht, Ihnen zu sagen, was das Beste für Ihren Code ist, ich sage nur, dass es gute Gründe dafür gibt, dass eine Abhängigkeits-Lib es nicht zulassen würde. Wenn ich es wäre, würde ich das Problem umgehen, indem ich einfach drei Ansichten verwende. – greim

+0

ist die untergeordnete Ansicht, die die übergeordnete Ansicht erweitern möchte (nicht die übergeordnete Ansicht, die die untergeordnete Ansicht erweitert). Ich frage mich, ob jemand Erfahrung mit der Verwendung von AMD mit Rückgrat und erweiterten Parent-Ansichten in untergeordneten Ansichten für die Verwendung von übergeordneten Methoden und der Ereignisbehandlung hatte. –

3

Nehmen wir an, diese Definition sitzt in 'views/main'

define(['backbone', 'views/node/base'],       
    function(Backbone, BaseView){ 
     var MainView = BaseView.extend({ 

     }); 

     return MainView; 
    } 
); 

Dann, wie Ihr Kind Ansicht:

define(['backbone', 'views/node/base'],       
    function(Backbone, BaseView) { 
     var PropertiesView = BaseView.extend({ 

     }); 

     return PropertiesView; 
    } 
); 

Dann woanders in einem Universum, weit weit weg:

myView = new MainView(); 

Verwenden des Beispiels aus dem Handbuch:

Dann
define(['backbone', 'views/node/base'],       
    function(Backbone, BaseView){ 
     var MainView = BaseView.extend({ 

     }); 

     return MainView; 
    } 
); 

define(['backbone'], function (Backbone) {     
    var BaseView; 

    require(['views/node/base'], function(b){ 
     BaseView = b; 
    }); 

    var PropertiesView = BaseView.extend({ 

    }); 

    return PropertiesView; 
}); 
+0

In meinem Fall, ja, ich gebe das "PropertiesView" zurück. Es scheint, dass ich kein Kind vom Elternteil instantiieren sollte, aber ich kann mir wirklich keinen anderen Weg vorstellen, wie der Elternteil auf sein Kind aufmerksam wird. – darksoulsong

+0

Es ist nichts falsch daran, eine Kindansicht im Prinzip vom Elternteil zu instanziieren. Sie könnten alternativ das CommonJS-Format verwenden oder nur eine Ihrer Ansichten in Anspruch nehmen. Siehe redolents Beispiel unter: http://stackoverflow.com/questions/4881059/how-to-handle-circular-dependencies-with-requirejs-amd – backdesk

1

Sie könnten PropertiesView erfordern dynamisch so BaseView nicht darauf angewiesen hat.

define(['backbone','underscore','jquery','views/node/base-view'], 
    function(Backbone, _, $, NodeBaseView){ 
    PropertiesView = NodeBaseView.extend({ 

     }); 
    } 
    return PropertiesView; 
}); 

Hier benötigen Sie PropertiesView

define(['backbone','underscore','jquery'], 
    function(Backbone, _, $, PropertiesView){ 
     NodeBaseView = Backbone.View.extend({ 
     .. 
      var PropertiesView = require('views/node/properites-view'); 
     .. 
      new PropertiesView({}); 
     .. 
     }); 

}); 

Beispiel:

define(['views/node/base-view', 'views/node/properites-view'], 
    function(NodeBaseView, PropertiesView){ 
     return { 
      base: new NodeBaseView() 
     } 
});