Почему Observable не стреляет?

У меня есть следующий код JS

        self.tagBuild = {
            systemId : ko.observable(),
            releaseVersion : ko.observable(),
            subReleaseVersion : ko.observable(),
            templateSize : ko.observable(),
            rehydrationCode : ko.observable(),
            repoLocation : ko.observable(),
            templateLocation : ko.observable(),
            faIntegLabel : ko.observable(),
            rehydrationCode : ko.observable(),
            cdrmDBTemplate : ko.observable(),
            dbOperation :ko.observable()
        }

Я инициализирую значения, используя приведенный ниже код

            self.tagBuild.systemId(self.jobDetails().system_id);
            self.tagBuild.releaseVersion(self.jobDetails().faReleaseVersion);
            self.tagBuild.templateSize(self.jobDetails().templateSize);
            self.tagBuild.rehydrationCode(self.jobDetails().repoLocation + "/ovm-tooling/oracle-ovmautomation-all.zip");
            self.tagBuild.repoLocation(self.jobDetails().repoLocation);
            self.tagBuild.templateLocation(self.jobDetails().templateLocation);

Я использую tagBuild для открытия диалогового окна. Проблема в том, что когда пользователь изменяет значения в пользовательском интерфейсе, значения в self.tagBuild.templateSize () или других наблюдаемых объектах не меняются. В чем может быть проблема?

Ниже приведен html-код, в котором используются наблюдаемые

        <div slot="body">
        <!-- ko with:tagBuild-->
            <div class="oj-form-layout">
                <div class="oj-form oj-sm-odd-cols-12 oj-md-odd-cols-4 oj-md-labels-inline oj-form-cols-labels-inline oj-form-cols-max2">
                        <div class="oj-flex">
                                <div class="oj-flex-item">
                                    <oj-label for="systemID" >System ID</oj-label>
                                </div>  
                                <div class="oj-flex-item">
                                    <oj-input-text id="releaseVersion" data-bind="attr: {value:systemId,readonly:true} " ></oj-input-text>
                                </div>  
                            </div>
                    <div class="oj-flex">
                        <div class="oj-flex-item">
                            <oj-label for="releaseVersion" >Release Version</oj-label>
                        </div>  
                        <div class="oj-flex-item">
                            <oj-input-text id="releaseVersion" data-bind="attr: {value:releaseVersion}" ></oj-input-text>
                        </div>  
                    </div>
                    <div class="oj-flex">
                        <div class="oj-flex-item">
                            <oj-label for="subReleaseVersion">Sub Release Version</oj-label>
                        </div>
                        <div class="oj-flex-item">
                            <oj-input-text id="subReleaseVersion" data-bind="attr: {value:subReleaseVersion}"></oj-input-text>
                        </div>    
                    </div>
                    <div class="oj-flex">
                        <div class="oj-flex-item">
                            <oj-label for="templateSize">Template Size</oj-label>
                        </div>  
                        <div class="oj-flex-item">
                            <oj-input-text id="templateSize" data-bind="attr: {value:templateSize}"></oj-input-text>
                        </div>
                    </div>
                    <div class="oj-flex">
                            <div class="oj-flex-item">
                                <oj-label for="templateSize1">Template Size</oj-label>
                            </div>  
                            <div class="oj-flex-item">
                                <oj-input-text id="templateSize1" data-bind="attr: {value:templateSize}"></oj-input-text>
                            </div>
                        </div>
                    <div class="oj-flex">
                        <div class="oj-flex-item">
                            <oj-label for="repoLocation">Repo Location</oj-label>
                        </div>
                        <div class="oj-flex-item">
                            <oj-input-text id="repoLocation" data-bind="attr: {value:repoLocation}"></oj-input-text>
                        </div>
                    </div>
                    <div class="oj-flex">
                        <div class="oj-flex-item">
                            <oj-label for="templateLocation">Template Location</oj-label>
                        </div>
                        <div class="oj-flex-item">
                            <oj-input-text id="Config" data-bind="attr: {value:templateLocation}"></oj-input-text>
                        </div>
                    </div> 
                    <div class="oj-flex">
                            <div class="oj-flex-item">
                                <oj-label for="FAIntegLabel">FA Integ Label</oj-label>
                            </div>
                            <div class="oj-flex-item">
                                <oj-input-text id="FAIntegLabel" data-bind="attr: {value:faIntegLabel}"></oj-input-text>
                            </div>
                        </div>               
                    <div class="oj-flex">
                        <div class="oj-flex-item">
                            <oj-label for="rehydrationCode">Rehydration Code </oj-label>
                        </div>
                        <div class="oj-flex-item">
                            <oj-input-text id="rehydrationCode" data-bind="attr: {value:rehydrationCode}"></oj-input-text>
                        </div>
                    </div>
                    <div class="oj-flex">
                            <div class="oj-flex-item">
                                <oj-label for="cdrmDBTemplate">CDRM DB Template </oj-label>
                            </div>
                            <div class="oj-flex-item">
                                <oj-input-text id="cdrmDBTemplate" data-bind="attr: {value:cdrmDBTemplate}"></oj-input-text>
                            </div>
                        </div> 
                </div>
            </div>           
        <!--/ko-->
        </div>
        <div slot="footer">
            <oj-button id="okButton" class='oj-button-primary' data-bind="click: saveBuildTags">Submit</oj-button>
        </div>

</oj-dialog>

person Chirayu Chirayu    schedule 14.09.2018    source источник
comment
Вы просто передаете данные из наблюдаемого jobDetails при инициализации, вероятно. Значения, которые вы вводите в свои наблюдаемые, сами по себе не наблюдаемые, поэтому, если jobDetails обновляется, ur tagBuild не будет обновлен.   -  person Joonas89    schedule 14.09.2018
comment
Это будет зависеть от того, как выглядит ваш HTML. Не могли бы вы это показать?   -  person Ray    schedule 14.09.2018
comment
@ Ray, пожалуйста, найдите код выше   -  person Chirayu Chirayu    schedule 14.09.2018
comment
@ Joonas89 Я просто устанавливаю начальное значение с помощью jobdetails. Такие переменные, как self.tagBuild.releaseVersion, по-прежнему остаются наблюдаемыми.   -  person Chirayu Chirayu    schedule 14.09.2018


Ответы (1)


Это похоже на предыдущую проблему, с которой я вам помог. Вы должны исправить способ определения компонентов Oracle-JET.

  • Не используйте data-bind для компонентов Oracle-JET, они уже используются внутри. Вы должны использовать свойства oj-input-text напрямую.
  • Также обратите внимание на двойные скобки {{}} и [[]]. Они имеют особое значение в Oracle JET. Первый создает слушателей чтения и записи для наблюдаемого внутри него, а второй создает просто слушателя чтения. В вашем коде этого нет. Но исходные значения работают нормально, потому что Knockout может помочь вам до этого момента.

Повторите все свои oj-input-text теги следующим образом:

<oj-input-text id="releaseVersion" value="{{systemId}}" readonly></oj-input-text>

Обратите внимание, что readonly также является свойством тега oj-input-text, поэтому он будет работать нормально, предоставляя стили OJET для преобразования ввода в режим только для чтения.

Вот Поваренная книга, которая показывает вам правильную синтаксис тега, и вот документация, которая показывает все свойства, которые вы можете использовать для тега.


P.S. Считайте Поваренную книгу своей библией для OJET. Написано красиво и очень тщательно. По-другому вы не сможете использовать компоненты OJET.

person Ray    schedule 14.09.2018
comment
Спасибо за ваше предложение. Вы упомянули, что мы не должны использовать привязку данных для компонентов Oracle Jet, но я вижу, что мы часто использовали привязку данных в нашем приложении, например: ‹oj-input-text id = filter maxlength = 30 placeholder = Type для фильтрации data-bind = event: {keyup: handleKeyUp}, attr: {value: filter} ›‹/oj-input-text›, и он отлично работает - person Chirayu Chirayu; 15.09.2018
comment
Интересно .. Хотелось бы, чтобы это работало, если возможно. Потому что похоже, что filter не будет обновляться в JS. - person Ray; 15.09.2018
comment
Кстати, не могли бы вы мне помочь, проголосовав за ответ на предыдущий вопрос? Благодарность :) - person Ray; 15.09.2018
comment
Хотя я согласен, что привязка событий будет работать правильно из-за функции «всплытия». - person Ray; 15.09.2018
comment
Я уже проголосовал за ваш ответ. Вы хотите, чтобы я сделал что-нибудь еще? - person Chirayu Chirayu; 15.09.2018
comment
Нет, нет, я имел в виду предыдущий вопрос stackoverflow.com / questions / 52263051 / - person Ray; 15.09.2018
comment
Я не могу проголосовать, так как мне нужно иметь минимальное количество сообщений, прежде чем я смогу проголосовать, поскольку я новичок в stackoverflow :) У меня есть одна проблема с предложенным решением. Как вы предложили, я сделал следующее: ‹div class = oj-flex-item› ‹oj-input-text id = subReleaseVersion value = {{subReleaseVersion}} required = 'true'› ‹/oj-input-text› ‹ / div ›Так как required истинно, он должен выдавать ошибку, если пользователь не дает никакого значения. Но он не показывает ошибку. Любые указатели? - person Chirayu Chirayu; 15.09.2018
comment
О, хорошо, без проблем :) Не знаю почему, но вы можете увидеть рабочий образец здесь oracle.com/webfolder/technetwork/jet/ - person Ray; 15.09.2018