我有一个Bootstrap模式,其中包含用于更新或创建实体的表单(在我的示例中为Company)。现在我的问题是,如果我使用模态查看实体,当我以任何方式关闭模态时它都不会清除字段。如果我单击“创建”按钮,表单仍然会填充,这应该会给我一个空白的模态。
如何从常规javascript执行我的一个ViewModel方法?这是我的代码的一些:
function ViewModel() {
var self = this;
function CompanyViewModel(company) {
var self = this;
self.Id = company.CompanyId;
self.Name = company.Name;
}
function BlankCompanyViewModel() {
var self = this;
self.Id = 0;
self.Name = "";
}
self.company = ko.observable();
self.companies = ko.observableArray();
self.clearCurrentCompany = function() {
self.company(new BlankCompanyViewModel());
};
// Initialize the view-model
$.getJSON("/api/company", function(companies) {
$.each(companies, function(index, company) {
self.companies.push(new CompanyViewModel(company));
});
self.clearCurrentCompany();
});
}
理想情况下,我想在模式的“隐藏”事件上运行ViewModel.clearCurrentCompany,如下所示:
$('#myModal').on('hidden', function() {
//Do something here, not sure what
});
答案 0 :(得分:4)
我喜欢在模态周围使用自定义绑定,使其基于填充/清除可观察对象来打开/关闭/显示。
类似的东西:
ko.bindingHandlers.modal = {
init: function(element, valueAccessor, allBindings, vm, context) {
var modal = valueAccessor();
//init the modal and make sure that we clear the observable no matter how the modal is closed
$(element).modal({ show: false, backdrop: 'static' }).on("hidden.bs.modal", function() {
if (ko.isWriteableObservable(modal)) {
modal(null);
}
});
//apply the template binding to this element
ko.applyBindingsToNode(element, { with: modal }, context);
return { controlsDescendantBindings: true };
},
update: function(element, valueAccessor) {
var data = ko.utils.unwrapObservable(valueAccessor());
//show or hide the modal depending on whether the associated data is populated
$(element).modal(data ? "show" : "hide");
}
};
然后对可观察对象使用它。它的作用类似于with
对该observable的绑定,并根据是否填充了observable来显示/隐藏模态。
下面是一个示例,显示了正在使用的内容,并设置了一个订阅,您可以在模式关闭时运行自定义代码。 http://jsfiddle.net/rniemeyer/uf3DF/
答案 1 :(得分:2)
function ViewModel() {
var self = this;
// your previous code
$('#myModal').on('hide', function() {
self.clearCurrentCompany();
});
}
就像那样。请注意,您需要隐藏,而不是隐藏,因为只有在模态完全消失后才会隐藏火焰。如果用户在上一个视图关闭之前打开一个创建,它仍将被填充。