Thanks : )
I used here a basic example, but actually my code is more complex. We
want to make elements (buttons, windows, toolbars, etc...), and we do
this in a mootools-like way :
var myButton = new UI.Button({label : 'My button'});
But we want them to act like native elements ( new Element('div') ) to
have the ability to do for example :
this.button = new UI.Button({label : 'My
button'}).addClass('customClass').inject(document.body).
Our classes always do in the initialize method : this.element = new
Element('div'). What I really need is a way to implement methods of
the native Element Class in our UI.Button class. Now we reimplement
one by one element's methods we need :
UI.Button = new Class({
initialize : function(){
this.setOptions();
this.element = new Element('div', {html : this.options.label})
},
inject : function(target, position){
this.element.inject(target, position);
return this;
},
setStyle: function(style, value) {
this.element.setStyle(style, value);
return this;
},
setStyles: function(styles) {
this.element.setStyles(styles);
return this;
},
addClass: function(className) {
this.element.addClass(className);
return this;
}
(.......)
});
Is there a better way to do this? Thanks,
Luca Pillonel
On Sep 13, 8:36 pm, Aaron <[EMAIL PROTECTED]> wrote:
> You don't want to have a return statement in your initialize method.
> Initialize is called when classes are invoked, but the invocation by
> default returns the instance of the class. By having your Button class
> return the element, you have no access to setContent.
>
> Using your example above, if I did:
>
> var myButton = new Button();
>
> myButton is the dom element, not the instance of the class.
> Consequently any methods in this class are useless. Instead, do
> something like this:
>
> var Button = new Class({
> initialize : function(){
> this.button = new Element('div');
> this.setContent('my button');
> },
> toElement: function(){
> return this.button;
> },
> setContent : function(content){
> this.button.set('html', content);
> }
>
> });
>
> var myButton = new Button();
> $(myButton).inject(...);
> myButton.setContent(...);
>
> etc.
>
> The use of the options class would also benefit here, as you could set
> options (like what the default text should be).
>
> Finally, the actual usage of this example is questionable, as the code
> here basically re-implements the basic Element constructor. If this is
> pasted here only as an example of what you're trying to do, then
> that's cool, but if you actually want to use this class as illustrated
> here, consider:
>
> new Button().setContent('foo');
> new Element('div').set('html', 'foo');
>
> You're not really saving yourself any effort.
>
> -Aaron
>
> On Sep 12, 5:27 pm, keif <[EMAIL PROTECTED]> wrote:
>
> > Now that I'm on topic (tee hee, my bad)
>
> > new Button().inject(document.body); wouldn't throw an error - it's a valid
> > element.
>
> > var Button = new Class({
> > initialize : function(){
> > this.button = new Element('div', {html : 'my button'});
> > return this.button;
> > },
> > setContent : function(content){
> > this.button.set('html', content);
> > }});
>
> > var newButton = new Button().inject(document.body).set('html', 'hello');
> > console.log(newButton); // this is in the page!
>
> > var myButton = new Button();
> > var domElement = $(myButton).set('html', 'goodbye');
> > console.log(domElement); // this is ready to be inserted wherever
>
> > If you wanted to include the content to be set when you call the button,
> > you'd need to set up variables to be passed into the button instance, if
> > that's a route you want to go.
>
> > So, uh, sorry for the mispost earlier. :-)
>
> > loki der quaeler wrote:
>
> > > you'll want your class to implement a method called toElement which
> > > returns the Element instance which you'd like inserted in the DOM
> > > (this.button in your class example below).
>
> > > once it implements this method you can refer to an instance wrapped
> > > by the $ function to have access to the instance's Element. in other
> > > words:
> > > var myButton = new Button();
> > > var domElement = $(myButton);
>
> > > odd: you can really have the javascript
> > > (new Button()).inject(document.body);
> > > executed with the Button class described below, and receive no
> > > javascript error?
>
> > > On Sep 12, 2008, at 4.27 PM, Luca Pillonel wrote:
>
> > >> I have a class creating elements. I.E.
>
> > >> var Button = new Class({
> > >> initialize : function(){
> > >> this.button = new Element('div', {html : 'my button'});
> > >> return this.button;
> > >> },
> > >> setContent : function(content){
> > >> this.button.set('html', content);
> > >> }
> > >> });
>
> > >> So i can create an element in my DOM like this :
> > >> var myButton = new Button().inject(document.body);
>
> > >> But how can I make
> > >> myButton.setContent('some new content');
> > >> ?
>
> > >> Thank you
>
> > --
> > View this message in
> > context:http://n2.nabble.com/can-a-class-return-both-himself-and-an-element--...
> > Sent from the MooTools Users mailing list archive at Nabble.com.