【问题标题】:MVC Knockout JS inside JQuery dialogJQuery 对话框中的 MVC Knockout JS
【发布时间】:2011-11-18 04:00:24
【问题描述】:

我在视图上使用淘汰赛 js 来显示字段列表(即名字、姓氏等)。这些字段使用可观察数组在剔除模板中列出。该模板包含以下字段:名称(输入)、翻译(选择)和添加/删除功能。 (见下文)

var viewModel = {
    Fields: ko.observableArray([new Field(2, "First Name", 1), new Field(3, "Last Name", 2)]),
    AvailableTranslations: ko.observableArray([new Translation(1, "Prefixes"), new Translation(2, "Suffixes")]),
    remove: function(item) {
        ko.utils.arrayRemoveItem(this.Fields, item)
    },
    add: function() {
        this.Fields.push(new Field(0, "", ""));
    }
};

var Translation = function(id, name) {
    this.ID = id;
    this.Name = name;
};

var Field = function(id, name, translationID){
    this.ID = ko.observable(id);
    this.Name = ko.observable(name);
    this.TranslationID = ko.observable(translationID);
};

在模板中的翻译选择列表旁边,我想要一个选项来添加不存在的新翻译。单击按钮时,我想打开一个 jquery UI 对话框,其中包含一个利用敲除的局部视图。部分视图将包含翻译名称以及旧值和新值(两个文本字段)。旧值和新值是一个可观察的数组。

var viewModelPartialDialog = {
    TranslationName: ko.observable(),
    Values: ko.observableArray([]),
};

var Value = function(id, oldVal, newVal) {
    this.ID = id;
    this.OldVal = oldVal;
    this.NewVal = newVal;
};

当用户提交部分视图的表单时,我希望它进行保存调用以及更新 AvailableTranslations 可观察数组。

任何人都可以帮助我或指出正确的方向来完成此任务吗?


感谢您的示例。这很有帮助,但不完全是我想要做的。在您的示例中,我无法将 observableArray 添加到 Product 中,然后在对话框的编辑模板中拥有一个嵌套模板。

回到我最初的示例,我想在 viewModelA 中添加新字段,类似于您拥有产品列表的方式。但是,我不想编辑对话框中的字段,而是打开一个对话框来添加新的翻译。在对话框中打开的新翻译将是一个单独的视图模型 (viewModelB)。添加翻译名称和值后,对话框将异步发布,然后更新原始视图模型 (viewModelA) 的 AvailableTranslations 可观察数组。

您能否提供此功能的示例?

【问题讨论】:

    标签: model-view-controller jquery-ui jquery-ui-dialog knockout.js


    【解决方案1】:

    这是一个可能与您正在执行的操作类似的示例:http://jsfiddle.net/rniemeyer/WpnTU/

    它在页面加载时设置对话框,但不打开它。然后,有一个自定义绑定处理程序,只要填充“selectedItem”可观察对象(可能是现有项或新项),就会调用该处理程序。

    简单的自定义绑定处理程序如下所示:

    //custom binding handler that opens the jQuery dialog, if the selectedProduct is populated
    ko.bindingHandlers.openDialog = {
        update: function(element, valueAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor());
            if (value) {
                $(element).dialog("open");
            }
        }
    }
    

    【讨论】:

    • 很好的例子。我还需要知道关闭事件何时触发,所以我为此添加了一个绑定。jsfiddle.net/WpnTU/25
    • Anders,onclose 警报使用 Chrome 触发两次。它发生在你身上吗?
    猜你喜欢
    • 2012-09-05
    • 2013-06-09
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2018-05-05
    • 2018-11-10
    相关资源
    最近更新 更多