Skip watcher in vueJS












0















I have a form for updating document entity.



The document entity consists of list of employees (which is an array of objects) and each employee has a post which is just a string.



I have a dropdown (kind of wrapper for vue-multiselect) which accepts the array of employees and syncs selected employee to a selectedEmployee variable in data().



And also I have a watcher for selectedEmployee which sets the post input automatically when an employee is selected in the dropdown.



So, when creating a document in the form everything's fine, however, when I update the document, then I fetch existing document from server, set selectedEmployee and set employee's post. But, the document also keeps employee's post, so the first time when I open document's form in order to update it, I don't want to automatically update document's post. I want it to be updated only when user actually selects employee himself.



But the watcher gets called the first time too.



So, imagine we have John Doe and his a manager. When I create the document, I change his post to designer. Then, I open up the document form in order to update it, and I should see that for this specific document John Doe's post is "designer", but the watcher gets called and returns the post to manager.



I tried to make a fake variable in data(), like doneFetching, but it works only if I update this var directly in watcher, which looks quite dangerous, plus, in other entities I have many different kinds of selected employees, so making tons of fake flags is not an option.



Here is real code sample (employee = representative in my case):



  selectedApproveRepresentative(representative) {
if (!representative) {
this.memoData.approve_representative_id = null
return
}

this.memoData.approve_representative_id = representative.id

// Here is temporary solution, but I have many watchers for many different kinds of employees. If I move the doneFetching flag after I initialized the form, it'll be set to true, and only after that the watcher will be called
if (this.mode === 'update' && !this.doneFetching) {
this.doneFetching = true
return
}

// In normal case a representative might have or have not post, so depending on this case we set it to be empty or filled. But this should not be called the first time I open the form
this.memoData.approve_representative_post_dative_case =
representative.post_dative_case ?
representative.post_dative_case : ''
},


Here is where I initialize data:



created() {
if (this.memo) {
this.memoData = _.cloneDeep(this.memo)
this.selectedApproveRepresentative = _.cloneDeep(this.memo.approve_representative)

}
},









share|improve this question























  • Could you break it down a little bit I readed all but it often repeats itself and its hard to see what your actual goal is

    – Badgy
    Nov 20 '18 at 13:23
















0















I have a form for updating document entity.



The document entity consists of list of employees (which is an array of objects) and each employee has a post which is just a string.



I have a dropdown (kind of wrapper for vue-multiselect) which accepts the array of employees and syncs selected employee to a selectedEmployee variable in data().



And also I have a watcher for selectedEmployee which sets the post input automatically when an employee is selected in the dropdown.



So, when creating a document in the form everything's fine, however, when I update the document, then I fetch existing document from server, set selectedEmployee and set employee's post. But, the document also keeps employee's post, so the first time when I open document's form in order to update it, I don't want to automatically update document's post. I want it to be updated only when user actually selects employee himself.



But the watcher gets called the first time too.



So, imagine we have John Doe and his a manager. When I create the document, I change his post to designer. Then, I open up the document form in order to update it, and I should see that for this specific document John Doe's post is "designer", but the watcher gets called and returns the post to manager.



I tried to make a fake variable in data(), like doneFetching, but it works only if I update this var directly in watcher, which looks quite dangerous, plus, in other entities I have many different kinds of selected employees, so making tons of fake flags is not an option.



Here is real code sample (employee = representative in my case):



  selectedApproveRepresentative(representative) {
if (!representative) {
this.memoData.approve_representative_id = null
return
}

this.memoData.approve_representative_id = representative.id

// Here is temporary solution, but I have many watchers for many different kinds of employees. If I move the doneFetching flag after I initialized the form, it'll be set to true, and only after that the watcher will be called
if (this.mode === 'update' && !this.doneFetching) {
this.doneFetching = true
return
}

// In normal case a representative might have or have not post, so depending on this case we set it to be empty or filled. But this should not be called the first time I open the form
this.memoData.approve_representative_post_dative_case =
representative.post_dative_case ?
representative.post_dative_case : ''
},


Here is where I initialize data:



created() {
if (this.memo) {
this.memoData = _.cloneDeep(this.memo)
this.selectedApproveRepresentative = _.cloneDeep(this.memo.approve_representative)

}
},









share|improve this question























  • Could you break it down a little bit I readed all but it often repeats itself and its hard to see what your actual goal is

    – Badgy
    Nov 20 '18 at 13:23














0












0








0








I have a form for updating document entity.



The document entity consists of list of employees (which is an array of objects) and each employee has a post which is just a string.



I have a dropdown (kind of wrapper for vue-multiselect) which accepts the array of employees and syncs selected employee to a selectedEmployee variable in data().



And also I have a watcher for selectedEmployee which sets the post input automatically when an employee is selected in the dropdown.



So, when creating a document in the form everything's fine, however, when I update the document, then I fetch existing document from server, set selectedEmployee and set employee's post. But, the document also keeps employee's post, so the first time when I open document's form in order to update it, I don't want to automatically update document's post. I want it to be updated only when user actually selects employee himself.



But the watcher gets called the first time too.



So, imagine we have John Doe and his a manager. When I create the document, I change his post to designer. Then, I open up the document form in order to update it, and I should see that for this specific document John Doe's post is "designer", but the watcher gets called and returns the post to manager.



I tried to make a fake variable in data(), like doneFetching, but it works only if I update this var directly in watcher, which looks quite dangerous, plus, in other entities I have many different kinds of selected employees, so making tons of fake flags is not an option.



Here is real code sample (employee = representative in my case):



  selectedApproveRepresentative(representative) {
if (!representative) {
this.memoData.approve_representative_id = null
return
}

this.memoData.approve_representative_id = representative.id

// Here is temporary solution, but I have many watchers for many different kinds of employees. If I move the doneFetching flag after I initialized the form, it'll be set to true, and only after that the watcher will be called
if (this.mode === 'update' && !this.doneFetching) {
this.doneFetching = true
return
}

// In normal case a representative might have or have not post, so depending on this case we set it to be empty or filled. But this should not be called the first time I open the form
this.memoData.approve_representative_post_dative_case =
representative.post_dative_case ?
representative.post_dative_case : ''
},


Here is where I initialize data:



created() {
if (this.memo) {
this.memoData = _.cloneDeep(this.memo)
this.selectedApproveRepresentative = _.cloneDeep(this.memo.approve_representative)

}
},









share|improve this question














I have a form for updating document entity.



The document entity consists of list of employees (which is an array of objects) and each employee has a post which is just a string.



I have a dropdown (kind of wrapper for vue-multiselect) which accepts the array of employees and syncs selected employee to a selectedEmployee variable in data().



And also I have a watcher for selectedEmployee which sets the post input automatically when an employee is selected in the dropdown.



So, when creating a document in the form everything's fine, however, when I update the document, then I fetch existing document from server, set selectedEmployee and set employee's post. But, the document also keeps employee's post, so the first time when I open document's form in order to update it, I don't want to automatically update document's post. I want it to be updated only when user actually selects employee himself.



But the watcher gets called the first time too.



So, imagine we have John Doe and his a manager. When I create the document, I change his post to designer. Then, I open up the document form in order to update it, and I should see that for this specific document John Doe's post is "designer", but the watcher gets called and returns the post to manager.



I tried to make a fake variable in data(), like doneFetching, but it works only if I update this var directly in watcher, which looks quite dangerous, plus, in other entities I have many different kinds of selected employees, so making tons of fake flags is not an option.



Here is real code sample (employee = representative in my case):



  selectedApproveRepresentative(representative) {
if (!representative) {
this.memoData.approve_representative_id = null
return
}

this.memoData.approve_representative_id = representative.id

// Here is temporary solution, but I have many watchers for many different kinds of employees. If I move the doneFetching flag after I initialized the form, it'll be set to true, and only after that the watcher will be called
if (this.mode === 'update' && !this.doneFetching) {
this.doneFetching = true
return
}

// In normal case a representative might have or have not post, so depending on this case we set it to be empty or filled. But this should not be called the first time I open the form
this.memoData.approve_representative_post_dative_case =
representative.post_dative_case ?
representative.post_dative_case : ''
},


Here is where I initialize data:



created() {
if (this.memo) {
this.memoData = _.cloneDeep(this.memo)
this.selectedApproveRepresentative = _.cloneDeep(this.memo.approve_representative)

}
},






vue.js vuejs2






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 20 '18 at 13:21









VictorVictor

1,89443874




1,89443874













  • Could you break it down a little bit I readed all but it often repeats itself and its hard to see what your actual goal is

    – Badgy
    Nov 20 '18 at 13:23



















  • Could you break it down a little bit I readed all but it often repeats itself and its hard to see what your actual goal is

    – Badgy
    Nov 20 '18 at 13:23

















Could you break it down a little bit I readed all but it often repeats itself and its hard to see what your actual goal is

– Badgy
Nov 20 '18 at 13:23





Could you break it down a little bit I readed all but it often repeats itself and its hard to see what your actual goal is

– Badgy
Nov 20 '18 at 13:23












1 Answer
1






active

oldest

votes


















1














as I understood, your problem is the watcher executed when you init the component. Have you tried setting the immediate property of the watcher to false?



Not everybody knows that the watchers can be defined in different ways.



The simple one that everybody know



watchers: {
propertyToWatch() { //code... }
}


Passing the name of a function as 'string'



watchers: {
propertyToWatch: 'nameOfAfunctionDefinedInMethodsSection'
}


The object declaration



This one is the most descriptive way of declaring a watcher. You write it as an object with a handler property (it can be the name of a function passed as string as above), and other properties like deep to watch nested properties of an object, or in your case immediate which tells to the watcher if the should run immediately when the component is mounted.



watchers: {
propertyToWatch: {
immediate: false,
handler: function() { //code.. }
}
}





share|improve this answer


























  • I knew it, but I thought that by default immediate is set to false. I'll try and tell you if it worked, thank you :)

    – Victor
    Nov 22 '18 at 17:08











  • Great, let me know the result

    – DobleL
    Nov 22 '18 at 19:05











  • Nope, it didn't work.. :( I logged create/mount/watcher functions to console and it turned out that even if immediate is set to false the watcher fires first time...

    – Victor
    Nov 25 '18 at 19:08











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53393939%2fskip-watcher-in-vuejs%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














as I understood, your problem is the watcher executed when you init the component. Have you tried setting the immediate property of the watcher to false?



Not everybody knows that the watchers can be defined in different ways.



The simple one that everybody know



watchers: {
propertyToWatch() { //code... }
}


Passing the name of a function as 'string'



watchers: {
propertyToWatch: 'nameOfAfunctionDefinedInMethodsSection'
}


The object declaration



This one is the most descriptive way of declaring a watcher. You write it as an object with a handler property (it can be the name of a function passed as string as above), and other properties like deep to watch nested properties of an object, or in your case immediate which tells to the watcher if the should run immediately when the component is mounted.



watchers: {
propertyToWatch: {
immediate: false,
handler: function() { //code.. }
}
}





share|improve this answer


























  • I knew it, but I thought that by default immediate is set to false. I'll try and tell you if it worked, thank you :)

    – Victor
    Nov 22 '18 at 17:08











  • Great, let me know the result

    – DobleL
    Nov 22 '18 at 19:05











  • Nope, it didn't work.. :( I logged create/mount/watcher functions to console and it turned out that even if immediate is set to false the watcher fires first time...

    – Victor
    Nov 25 '18 at 19:08
















1














as I understood, your problem is the watcher executed when you init the component. Have you tried setting the immediate property of the watcher to false?



Not everybody knows that the watchers can be defined in different ways.



The simple one that everybody know



watchers: {
propertyToWatch() { //code... }
}


Passing the name of a function as 'string'



watchers: {
propertyToWatch: 'nameOfAfunctionDefinedInMethodsSection'
}


The object declaration



This one is the most descriptive way of declaring a watcher. You write it as an object with a handler property (it can be the name of a function passed as string as above), and other properties like deep to watch nested properties of an object, or in your case immediate which tells to the watcher if the should run immediately when the component is mounted.



watchers: {
propertyToWatch: {
immediate: false,
handler: function() { //code.. }
}
}





share|improve this answer


























  • I knew it, but I thought that by default immediate is set to false. I'll try and tell you if it worked, thank you :)

    – Victor
    Nov 22 '18 at 17:08











  • Great, let me know the result

    – DobleL
    Nov 22 '18 at 19:05











  • Nope, it didn't work.. :( I logged create/mount/watcher functions to console and it turned out that even if immediate is set to false the watcher fires first time...

    – Victor
    Nov 25 '18 at 19:08














1












1








1







as I understood, your problem is the watcher executed when you init the component. Have you tried setting the immediate property of the watcher to false?



Not everybody knows that the watchers can be defined in different ways.



The simple one that everybody know



watchers: {
propertyToWatch() { //code... }
}


Passing the name of a function as 'string'



watchers: {
propertyToWatch: 'nameOfAfunctionDefinedInMethodsSection'
}


The object declaration



This one is the most descriptive way of declaring a watcher. You write it as an object with a handler property (it can be the name of a function passed as string as above), and other properties like deep to watch nested properties of an object, or in your case immediate which tells to the watcher if the should run immediately when the component is mounted.



watchers: {
propertyToWatch: {
immediate: false,
handler: function() { //code.. }
}
}





share|improve this answer















as I understood, your problem is the watcher executed when you init the component. Have you tried setting the immediate property of the watcher to false?



Not everybody knows that the watchers can be defined in different ways.



The simple one that everybody know



watchers: {
propertyToWatch() { //code... }
}


Passing the name of a function as 'string'



watchers: {
propertyToWatch: 'nameOfAfunctionDefinedInMethodsSection'
}


The object declaration



This one is the most descriptive way of declaring a watcher. You write it as an object with a handler property (it can be the name of a function passed as string as above), and other properties like deep to watch nested properties of an object, or in your case immediate which tells to the watcher if the should run immediately when the component is mounted.



watchers: {
propertyToWatch: {
immediate: false,
handler: function() { //code.. }
}
}






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 25 '18 at 19:33

























answered Nov 21 '18 at 2:33









DobleLDobleL

1,529513




1,529513













  • I knew it, but I thought that by default immediate is set to false. I'll try and tell you if it worked, thank you :)

    – Victor
    Nov 22 '18 at 17:08











  • Great, let me know the result

    – DobleL
    Nov 22 '18 at 19:05











  • Nope, it didn't work.. :( I logged create/mount/watcher functions to console and it turned out that even if immediate is set to false the watcher fires first time...

    – Victor
    Nov 25 '18 at 19:08



















  • I knew it, but I thought that by default immediate is set to false. I'll try and tell you if it worked, thank you :)

    – Victor
    Nov 22 '18 at 17:08











  • Great, let me know the result

    – DobleL
    Nov 22 '18 at 19:05











  • Nope, it didn't work.. :( I logged create/mount/watcher functions to console and it turned out that even if immediate is set to false the watcher fires first time...

    – Victor
    Nov 25 '18 at 19:08

















I knew it, but I thought that by default immediate is set to false. I'll try and tell you if it worked, thank you :)

– Victor
Nov 22 '18 at 17:08





I knew it, but I thought that by default immediate is set to false. I'll try and tell you if it worked, thank you :)

– Victor
Nov 22 '18 at 17:08













Great, let me know the result

– DobleL
Nov 22 '18 at 19:05





Great, let me know the result

– DobleL
Nov 22 '18 at 19:05













Nope, it didn't work.. :( I logged create/mount/watcher functions to console and it turned out that even if immediate is set to false the watcher fires first time...

– Victor
Nov 25 '18 at 19:08





Nope, it didn't work.. :( I logged create/mount/watcher functions to console and it turned out that even if immediate is set to false the watcher fires first time...

– Victor
Nov 25 '18 at 19:08


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53393939%2fskip-watcher-in-vuejs%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

MongoDB - Not Authorized To Execute Command

How to fix TextFormField cause rebuild widget in Flutter

in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith