одностраничные приложения, использующие представление в качестве пользовательского элемента управления в родительских представлениях

0

Пожалуйста, помогите мне в этом вопросе. Я использую durandal 2.0, requirejs, нокаут и бриз для моего спа-приложения. У меня есть view (options.html), который я хочу использовать в качестве пользовательского элемента управления для 3 других представлений (view1.html, view2.html и view3.html). Ниже приведено представление вида опций.

define(['durandal/app', 'services/logger', 'knockout', 'jquery', 'services/unitofwork'], function (app, logger, ko, $, unitofwork) {

    var uow = unitofwork.create();
    var substatus = ko.observableArray();
    var vm = {
        status: substatus,
        activate: activate,
        startDate: ko.observable(),
        endDate: ko.observable(),
        attached: function (view, parent) {

            var startdatepicker = $(view).find('#startdatediv').datepicker();
            var enddatepicker = $(view).find('#enddatediv').datepicker();
            var starttxt = $(view).find('#txtstartDate');
            var endtxt = $(view).find('#txtendDate');

            startdatepicker.on('changeDate', function (ev) {

                starttxt.text(startdatepicker.datepicker('getAsText'));
                if ((date && date.valueOf()) > (endDate && endDate.valueOf())) {
                    $('#alert').show().find('strong').text('The start date cannot be after the end date');
                } else {
                    $('#alert').hide();
                    startDate = date;
                }

                startdatepicker.datepicker('hide');
            });
            enddatepicker.on('changeDate', function (ev) {

                starttxt.text(startdatepicker.datepicker('getAsText'));
                if ((date && date.valueOf()) > (endDate && endDate.valueOf())) {
                    $('#alert').show().find('strong').text('The start date cannot be after the end date');
                } else {
                    $('#alert').hide();
                    startDate = date;
                }

                enddatepicker.datepicker('hide');
            });
            console.log(startdatepicker.html());
            console.log(enddatepicker.html());
        }
    };

    return vm;

    function activate() {
        return true;
    }


    function fail(error) {

        logger.logError(msg, error, "", true);
    }
    function getPredicate() {
        var predicate = new breeze.Predicate.create("LookupId", "==", 1);
        console.log(predicate);


        return predicate;
    }
});

Моя проблема теперь, когда я пытаюсь перемещаться между 3 родительскими представлениями. Кажется, что значение i, выбранное из datepicker в первом родительском представлении, распознается в двух других представлениях. Как достичь логики, где в представлении вариантов действует, как будто у него есть другой идентификатор при навигации из трех разных родительских представлений. Заранее спасибо.

Теги:
single-page-application
knockout.js

1 ответ

0

Вам нужно общаться между режимами просмотра (родительский vm для параметров vm и наоборот) Существует несколько способов

  1. Обмен сообщениями между VMs-, вы можете использовать оповещение с нокаутом или durandal messaging framework для отправки сообщений между виртуальными машинами, поэтому параметры vm обновляют его значение, однако было бы сложно запомнить значения для каждого vm, поэтому сами родительские vms должны удерживать значения. Это заставляет склоняться к моему второму варианту.
  2. Вместо того, чтобы делать vm как vm, просто используйте его как класс внутри всех родительских vms. В родительских представлениях добавьте представление параметров в качестве шаблона и привяжите к нему объект options, таким образом, у вас будет объект опций для каждого представления, и они независимы и будут поддерживать свои значения сами.
  • 0
    Спасибо, Дхана, я смог создать шаблон для опции vm и использовать его в трех видах.
  • 0
    отлично, если вы это ответ, который вы искали, вы могли бы принять ответ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню