{"action":"created","issue":{"url":"https://api.github.com/repos/nasa/openmct/issues/1074","repository_url":"https://api.github.com/repos/nasa/openmct","labels_url":"https://api.github.com/repos/nasa/openmct/issues/1074/labels{/name}","comments_url":"https://api.github.com/repos/nasa/openmct/issues/1074/comments","events_url":"https://api.github.com/repos/nasa/openmct/issues/1074/events","html_url":"https://github.com/nasa/openmct/pull/1074","id":163468217,"number":1074,"title":"Mutation API","user":{"login":"akhenry","id":4215777,"avatar_url":"https://avatars.githubusercontent.com/u/4215777?v=3","gravatar_id":"","url":"https://api.github.com/users/akhenry","html_url":"https://github.com/akhenry","followers_url":"https://api.github.com/users/akhenry/followers","following_url":"https://api.github.com/users/akhenry/following{/other_user}","gists_url":"https://api.github.com/users/akhenry/gists{/gist_id}","starred_url":"https://api.github.com/users/akhenry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akhenry/subscriptions","organizations_url":"https://api.github.com/users/akhenry/orgs","repos_url":"https://api.github.com/users/akhenry/repos","events_url":"https://api.github.com/users/akhenry/events{/privacy}","received_events_url":"https://api.github.com/users/akhenry/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2016-07-01T20:24:43Z","updated_at":"2016-07-05T16:49:43Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/nasa/openmct/pulls/1074","html_url":"https://github.com/nasa/openmct/pull/1074","diff_url":"https://github.com/nasa/openmct/pull/1074.diff","patch_url":"https://github.com/nasa/openmct/pull/1074.patch"},"body":""},"comment":{"url":"https://api.github.com/repos/nasa/openmct/issues/comments/230535421","html_url":"https://github.com/nasa/openmct/pull/1074#issuecomment-230535421","issue_url":"https://api.github.com/repos/nasa/openmct/issues/1074","id":230535421,"user":{"login":"larkin","id":226503,"avatar_url":"https://avatars.githubusercontent.com/u/226503?v=3","gravatar_id":"","url":"https://api.github.com/users/larkin","html_url":"https://github.com/larkin","followers_url":"https://api.github.com/users/larkin/followers","following_url":"https://api.github.com/users/larkin/following{/other_user}","gists_url":"https://api.github.com/users/larkin/gists{/gist_id}","starred_url":"https://api.github.com/users/larkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/larkin/subscriptions","organizations_url":"https://api.github.com/users/larkin/orgs","repos_url":"https://api.github.com/users/larkin/repos","events_url":"https://api.github.com/users/larkin/events{/privacy}","received_events_url":"https://api.github.com/users/larkin/received_events","type":"User","site_admin":false},"created_at":"2016-07-05T16:49:43Z","updated_at":"2016-07-05T16:49:43Z","body":"Generally the developers using this system to watch for changes will be the same ones triggering the changes (e.g. I make a plot view, I make a plot options view, I expect a certain granularity of events). When we do automatic form generation that may be a bit different but will likely be well documented.\r\n\r\nWe should have some guidelines that answer questions like \"when should I listen to a wildcard versus a specific child property?\" or \"when should I listen to an object instead of an object subproperty?  \r\n\r\nMy example for the second case:\r\n```json\r\n{\r\n    \"yAxis\": {\r\n        \"min\": undefined,\r\n        \"max\": undefined,\r\n        \"autoscale\": true\r\n    }\r\n}\r\n```\r\nQuestion here: should you listen to `yAxis` or `yAxis.min`, `yAxis.max`, and `yAxis.autoscale`?  In this case, there is a complex validation relationship between the three fields; `min` and `max` are only valid if `autoscale` is false, and if `autoscale` is false then both of them must be specified and satisfy certain constraints.  Ultimately, you expect all of them to be set at the same time thus you can get by setting/watching `plot.yAxis`.\r\n\r\n> We are going to have to be super careful about keeping objects in sync between views. In this case I've done it by updating the whole object whenever it changes. This may dissuade the use of using property paths for triggering view updates. A possible approach to this is to avoid using object references and define view functions so that they operate on values passed into them, rather than using objects as member variables. For example, TodoView.render could accept a task list, and then show could bind to tasks instead of the wildcard *.\r\n\r\nAgree, I think the strategy is \"keep the view in sync; don't keep a copy of the object around because that may be invalid\".  I think your \"use the values passed to the listener, not a object reference\" is a good option for that."}}
{"actor":{"display_login":"larkin"}}