gpt4 book ai didi

javascript - jquery UI 模态对话框打破了 js 绑定(bind)

转载 作者:行者123 更新时间:2023-11-29 10:51:00 25 4
gpt4 key购买 nike

Intent 是为了让用户点击 Logo 部分并看到一个模式对话框,他们可以在其中上传新 Logo 图像、更改当前 Logo 图像或删除当前 Logo 图像。

现在上传图片会导致页面刷新,但我正在转向使用 ajax 帖子处理此功能以防止页面刷新。

我遇到的问题是,一旦图像存在,并且用户删除了图像,模态对话框在 knockout js 模型出现后不会更新。图像显示在两个区域中,一次显示在屏幕上应该显示的位置,另一次显示在模态对话框中作为预览。主图像 src 更新,我可以隐藏,但看起来当 jQueryUI 克隆元素时,knockout 和对话框之间的绑定(bind)被删除了。

我试图使用这个 post 中的初始化示例但模态对话框没有呈现。

有什么想法吗?

HTML/Razor

<div id="logo" data-bind="cmdDialog: {id:'dialog-form', cmd:'open'} ">
<div id="changeLogo">
<h1 data-bind="visible: URL() == null"><span>Logo Here</span></h1>
<img data-bind="attr: { src: URL}, visible: URL() != null"/>
</div>
<div id="dialog-form" data-bind="setDialog:{}">
<img data-bind="attr: { src: URL}"/>
<button type="button" data-bind="visible: URL() != null, deleteImage: ImageID">Remove Image</button>
<hr/>
<form action="uploadImage" method="post">
@Html.HiddenFor(m => m.ID, new { data_bind = "value: ID" })
@Html.HiddenFor(m => m.ImageID, new { data_bind = "value: ImageID" })
<div>
<input type="file" name="file" id="file"/>
</div>
<div>
<input type="submit" value="Upload" />
<button type="button" data-bind="cmdDialog: {id:'dialog-form', cmd:'close'} ">Cancel</button>
</div>
</form>
</div>
</div>

JavaScript

$(document).ready(function () {
/*************************************/
// Modal Dialog config
/*************************************/
var options = {
autoOpen: false,
resizable: false,
modal: true,
height: 400,
width: 450
};

/*************************************/
// Knockout config
/*************************************/
var viewModelLogo;

ko.bindingHandlers.setDialog = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
var $element = $(element);

setTimeout(function() {$element.dialog(options); }, 0);
}
};

ko.bindingHandlers.cmdDialog = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
$(element).click(function() {
var parms = ko.utils.unwrapObservable(valueAccessor());
var $logoForm = $('#' + parms.id);

$logoForm.dialog(parms.cmd);
});
}
};

ko.bindingHandlers.deleteImage = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
$(element).click(function() {
deleteImage(viewModel);
});
}
};
$.getJSON("/Logo/Logo/GetPageModel", Model.ID, function(result) {
updateModel(result.Data);
});

var deleteImage = function(imageModel) {
var image = ko.toJS(imageModel);
$.post("/Logo/Logo/deleteImage", image, function(result) {
updateModel(result.Data);
});
};

function updateModel(image) {
viewModelLogo = ko.mapping.fromJS(image);
ko.applyBindings(viewModelLogo, document.getElementById('logo'));
$('#dialog-form').dialog("close");
};
});

最佳答案

我发现当我像您那样定义对话框时——即作为一个普通的 div 绑定(bind)将不起作用。但是,当我使用模板时,我可以使用数据参数来指定我绑定(bind)到的项目,它将所有内容都纳入范围,包括我在 View 模型上使用的其他项目。

查看 Ryan Niemeyer 的优秀示例,该示例使用更新原始页面的对话窗口执行此操作 http://jsfiddle.net/rniemeyer/WpnTU/

注意他是如何将对话框的内容定义为模板的。

关于javascript - jquery UI 模态对话框打破了 js 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10306130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com