The underlying WidgetViewModel is using *value *to save to the database.

If you have bound *this.**username* observable to the textInput then you 
will need to update *this.value* when it changes: 

this.username.subscribe(function(usernameValue) {
this.value(usernameValue);
});

I've not tested this at all and can't remember if usernameValue is returned 
as a value or observable. If it is an observable then you'll need to user 
usernameValue().

Andy

On Friday, January 17, 2020 at 8:25:58 PM UTC, Angela Labrador wrote:
>
> Sure -- here's my sanity check version (putting aside the need to pass the 
> django {{user.username}} as the autofill value and just using a plain 
> string of "abc"):
>
> templates/views/components/widgets/text.htm
>         <!-- ko if: node.nodeid == "a72bbb27-bd5d-11e9-9b8f-94659cf754d0" 
> -->
>                 <input type="text" data-bind="textInput: username, attr: 
> {placeholder: placeholder, maxlength: maxLength, disabled: disabled}, 
> style: {width: width}" class="form-control input-lg widget-input">
>         <!-- /ko -->
>         <!-- ko ifnot: node.nodeid == 
> "a72bbb27-bd5d-11e9-9b8f-94659cf754d0" -->
>             <input type="text" data-bind="textInput: value, attr: 
> {placeholder: placeholder, maxlength: maxLength, disabled: disabled}, 
> style: {width: width}" class="form-control input-lg widget-input">
>         <!-- /ko -->
>
>
> media/js/views/components/widgets/text.js
> define(['knockout', 'underscore', 'viewmodels/widget'], function (ko, _, 
> WidgetViewModel) {
>     /**
>     * registers a text-widget component for use in forms
>     * @function external:"ko.components".text-widget
>     * @param {object} params
>     * @param {string} params.value - the value being managed
>     * @param {function} params.config - observable containing config object
>     * @param {string} params.config().label - label to use alongside the 
> text input
>     * @param {string} params.config().placeholder - default text to show 
> in the text input
>     */
>     return ko.components.register('text-widget', {
>         viewModel: function(params) {
>             params.configKeys = ['placeholder', 'width', 'maxLength', 
> 'defaultValue'];
>             WidgetViewModel.apply(this, [params]);     
>             this.username = ko.observable("abc");
>         },
>         template: { require: 'text!widget-templates/text' }
>     });
> });
>
>
> This displays 'abc' in the form field upon load, but returns a 500 error 
> on tile when I click add. I'm not too surprised since params.value is not 
> getting set, but I can't wrap my head around how to autofill the field on 
> the template without setting *all* textwidget params.values to 
> {{user.username}}. I even tried setting attr: value={{user.username}} on 
> the template side without touching the viewmodel, but while the username 
> appeared, it was the same 500 error on tile (no value being passed). 
>
> Thanks for any ideas!
> Angela
>  
>
>
> On Friday, January 17, 2020 at 4:31:06 AM UTC-5, Andrew Jones wrote:
>>
>> Sounds like you're close. do you mind posting the viewmodel code as a 
>> fresh pair of eyes might be able to help?
>>
>> On Wednesday, January 15, 2020 at 11:34:51 PM UTC, Angela Labrador wrote:
>>>
>>> Hi everyone,
>>>
>>> I have a node, let's call it <userid> (datatype string), which uses the 
>>> default text widget. When users are completing the relevant form, I would 
>>> like to autofill <userid> with the {{user.username}} value (but to still 
>>> allow users to change the value). 
>>>
>>> I've been trying to avoid writing a new widget to handle this scenario 
>>> and instead use the existing text widget viewmodel and template. I'm 
>>> successfully able to target the correct node by using knockout if/ifnot 
>>> bindings
>>> e.g.:
>>>
>>> <!-- ko if: node.nodeid == "a72bbb27-bd5d-11e9-9b8f-94659cf754d0" -->
>>> ...
>>> <!-- /ko -->
>>> <!-- ko ifnot: node.nodeid == "a72bbb27-bd5d-11e9-9b8f-94659cf754d0" -->
>>>             <input type="text" data-bind="textInput: value, attr: 
>>> {placeholder: placeholder, maxlength: maxLength, disabled: disabled}, 
>>> style: {width: width}" class="form-control input-lg widget-input">
>>> <!-- /ko -->
>>>
>>>
>>> However, each attempt I make at the custom input fails (using either 
>>> value or textInput data-binds). It's seemingly easy to make the correct 
>>> username appear in the form field when the card loads (by setting 
>>> params.value to {{user.username}}) but every time I click Add on the form, 
>>> the tile save function fails validation (500 error), so I'm not actually 
>>> passing the value correctly or it's getting set/unset at the wrong times or 
>>> in the wrong order. As a sanity check I've also tried a simple 
>>> data-bind="textInput: userName..." in the template and then this.userName = 
>>> ko.observable('abc'); in the textwidget viewmodel, but while abc appears in 
>>> the field, I get the same 500 error upon submit. Even when I manually 
>>> delete the field and type something new, the form fails. I should note that 
>>> the card has multiple text widgets on it.
>>>
>>> I'm fairly new to knockout, so I could be attacking this all wrong or 
>>> missing something fundamental. Any ideas for how this could be done? 
>>> (Trying to avoid editing the resource model...but maybe that can't be 
>>> avoided).
>>>
>>> Thanks!
>>> Angela
>>>
>>

-- 
-- To post, send email to [email protected]. To unsubscribe, send 
email to [email protected]. For more information, 
visit https://groups.google.com/d/forum/archesproject?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Arches Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/archesproject/9757adfd-fa57-4c08-8f6c-61f66b8f671b%40googlegroups.com.

Reply via email to