>
>
> => Java to JS component translation
>
> Indeed the Java introspection at runtime is also not my favorite thing. 
> Adding a $ before each property name could be a valid solution and I'm 
> surely considering it :).
> This will also negate the need to filter out properties manually (like the 
> ___ that is too generic), because only the "interesting" properties would 
> be copied over.
>

I'm no longer sure that would work. Even if I prefix my "to-go-in-data {}" 
fields in the Java class with $ so as to signal VueGwt to only put these 
properties in data {}, Vue monitors the properties defined in data {} 
*recursively. *So if I have a field which is OK to go in data {} but the 
object kept inside this field *itself *has fields which should not be 
monitored by Vue, there is no way to tell Vue not to do so... Just look at 
Vue's state.js & observer.js code...
 

>
> For the @JsProperty, sadly they still would need it (or at least a @JsType 
> + public properties), as the Vue.JS template are not parsed by GWT. The 
> name in the template must match the ones in the JS translation of the Java 
> component. If GWT rename them at compile time, then you'll get for example:
> {{ bob }} in your template and data: {a: "hello"} in your component.
>

That's correct.

 

>
> => Circular reference in data model.
>
> I tried to create in pure Vue.JS a component that returns a circular 
> reference upon creation, and it also breaks:
> https://codepen.io/anon/pen/oBXBmB
> (if you remove the test.circular = test, it works again).
>
> Also Vue doc in v1 specifically said that it needs not not contain 
> circular reference. In the v2 they say that you can clone the data using 
> JSON.stringify(JSON.parse(...));
> https://github.com/vuejs/Discussion/issues/265
> https://vuejs.org/v2/api/#data
>
> Fixing the way we build the Component data to make sure to only integrate 
> the properties needed by the user would probably make this less of an issue.
>

I think the "return JSON.parse(JSON.stringify(data));" trick that you do in 
VueGwtTools.js has to go. 
For one, this call completely disconnects the original set of fields in 
data {}, from the ones that Vue will monitor. So I'm not sure that the 
current VueGwt implementation monitors the correct fields at all?

Also, a copy of the data {} is anyway required in Vue.js only when you 
register a new Vue *component* (as opposed to just instantiating a new Vue 
instance): https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function
Perhaps the misunderstanding and the mismatch comes from how you register a 
new component. In  your example, you do it like this:

@JsTypepublic class RootComponent extends VueComponent
{
    public RootComponent()
    {
        // ChildComponent is registered to be used in our RootComponent
        this.registerComponent(new ChildComponent());
    }
}


In Java and also with your approach where data {}, props {} methods {} and 
all are flattened in a single Java object, it would feel much more natural 
if you do it like this:

@JsTypepublic class RootComponent extends VueComponent
{
    public RootComponent()
    {
        // ChildComponent is registered to be used in our RootComponent
        this.registerComponent(ChildComponent.class);
    }
}


... and then VueGwt should map a JS *function *to the Vue "data" property 
which function should instantiate a fresh instance of the ChildComponent 
class, ending up with a separate data {} copy for each new component 
instance, as is required.
(It is another topic how to do this reflective instantiation of the 
component with GWT anyway. Perhaps you need a Factory pattern here, in the 
absence of reflection in GWT?)

 

>
> => Minor issues
>
> 1: Yes, for now we just wanted to get feedback, so it wasn't needed, but 
> if people show interest it will happen.
>
> 2: Indeed, nice catch! I'll make sure to add it to the documentation.
>
>
> => Other questions
>
> As you saw even if the Java introspection is nice and pretty easy to do 
> (with naming convention), it doesn't not feel very "Java" or clean to code 
> with it. I was thinking about using annotations with annotations processor 
> to avoid having naming conventions.
>
> For example a simple component could look like:
> @Component
> public class myComponent extends VueComponent {
>   @VueData
>   protected String myMessage = "Hello";
>
>   @VueMethod
>   protected void resetMessage() {
>     this.myMessage = "";
>   }
>
>   @VueWatch
>   protected void myMessage() {
>     // Do something
>   }
> }
>
> This would be much cleaner to code. Also it might be possible to 
> automatically bind templates, we would also gain the ability to fine tune 
> the component behavior by passing parameters to the @Component annotation.
>
> My main issue with this is after doing some research, it seems that 
> annotation processors integrates poorly for now with GWT super dev mode. 
> You have to manually rereun the annotation processor after each change. I 
> do think the code would look nice with annotations, but if developing with 
> it becomes slow and cumbersome, then there is not really a point.
>
>  

> I wonder what you think of this idea, and if you have any experience with 
> annotation processor in GWT ?
>

That would be nice. I have no experience with annotation processors myself, 
unfortunately. I think Angular2-Gwt uses this approach, isn't it? Perhaps 
you can contact the Angular2-Gwt maintainer for further info on the subject.

But then: even with that approach you have the "recursion" problem I 
mentioned at the top of my reply (Vue.js traversing all properties in data 
{} recursively), isn't it?



-- 
You received this message because you are subscribed to the Google Groups "GWT 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.

Reply via email to