【问题标题】:single page apps using a view as user control in parent views在父视图中使用视图作为用户控件的单页应用程序
【发布时间】:2013-10-11 01:08:45
【问题描述】:

请帮我解决这个问题。我正在为我的 spa 应用程序使用 durandal 2.0、requirejs、knout 和微风。我有一个视图(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 个父视图之间导航时。我从第一个父视图中的日期选择器中选择的值似乎在其他两个视图中被识别。当从 3 个不同的父视图导航时,我如何实现选项视图中的逻辑,就像它具有不同的 id 一样。提前致谢。

【问题讨论】:

    标签: javascript jquery knockout.js single-page-application


    【解决方案1】:

    您需要的是在视图模型之间进行通信(父 vm 到选项 vm,反之亦然)有几种方法

    1. VM 之间的消息传递-您可以使用敲除通知或 durandal 消息传递框架在 VM 之间发送消息,因此选项 vm 会刷新其值,但是记住每个 vm 的值会有点复杂,因此父 vm 本身应该保持价值观。这使我倾向于我的第二个选择。
    2. 不要将选项 vm 作为 vm ,只需将其用作所有父 vm 中的类。在父视图中添加选项视图作为模板并将选项对象绑定到它,这样每个视图都会有一个选项对象,它们是独立的,并且会自己维护它们的值。

    【讨论】:

    • 感谢 dhana,我能够为选项 vm 创建一个模板并在三个视图上使用它..
    • 太好了,如果这是您要找的答案,您能接受吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2015-02-19
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2013-04-18
    • 2016-03-03
    相关资源
    最近更新 更多