【发布时间】:2016-01-29 12:54:24
【问题描述】:
在我的应用程序中,我们从 ASP.NET MVC 方法获取 json 数据。 并使用数据绑定绑定视图。 目前我正在使用 Knockout JavaScript library v2.2.1 和 Knockout Mapping plugin v2.3.5。
所以每当我加载局部视图时,我必须再次调用相同的绑定方法来绑定局部视图中的属性。
因此,如果我将淘汰库更新为最新的并再次调用绑定方法,则会引发以下错误:
未捕获的错误:您不能将绑定多次应用于同一个 元素。
有什么方法可以调用绑定方法一次,然后在局部视图中绑定属性而不调用绑定方法?或者我必须改变什么才能使用新的库版本?
我目前使用的绑定数据的方法,每次加载局部视图时调用
function getResourceFile(CallBack) {
var Menu = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
};
if (typeof localStorage === 'object') {
try {
// Geeting language and localize application on this behalf STARTED
var lang = localStorage.getItem('lan');
var userLang = '';
if (lang === null || lang === 'undefined' || lang === '') {
userLang = window.navigator.language || window.navigator.userLanguage;
if (typeof userLang == 'undefined')
userLang = "en";
}
else {
userLang = lang;
}
//userLang = "en";//comment this
if (userLang.toString().length == 2) {
if (userLang == 'de') { CurrentLocale = "de-DE"; }
else { CurrentLocale = "en-US"; }
}
var l_lang = $.trim(userLang.substr(0, 2));
var currentURL = document.URL;
if (currentURL.indexOf("SelectApp/de") != -1) {
userLang = 'de';
CurrentLocale = "de-DE";
l_lang = 'de';
}
else if (currentURL.indexOf("SelectApp/en") != -1) {
userLang = 'en';
CurrentLocale = "en-US";
l_lang = 'en';
}
var jsonName = endpoints.CPRes + l_lang;
localStorage.setItem('lan', userLang);
$.getJSON(jsonName, function (data) {
LocalizationViewModel = data;
ko.applyBindings(new Menu(data));
CallBack && CallBack();
});
} catch (e) {
Storage.prototype._setItem = Storage.prototype.setItem;
Storage.prototype.setItem = function () { };
alert('Your web browser does not support storing settings locally. In Safari, the most common cause of this is using "Private Browsing Mode". Some settings may not save or some features may not work properly for you.');
}
}
}
function BindDataViewModel() {
if (LocalizationViewModel === null || LocalizationViewModel === 'undefined' || LocalizationViewModel === '') {
getResourceFile();
} else {
//var localdeferred = $.Deferred();
var t = setTimeout(function () {
ko.applyBindings(LocalizationViewModel);
// localdeferred.resolve();
}, 300);
//return localdeferred;
}
}
【问题讨论】:
-
不允许多次调用
applyBindings,为此您必须使用cleanNode并重新应用绑定 -
这看起来像是 ko.mapping 的工作。
-
请改进你的问题:只留下理解问题所必需的代码,并更清楚地解释你如何运行你的代码,你期望它做什么,它做什么,或者什么你得到的错误。您问题中的代码包含很多用于处理语言的行,这些行根本不相关。这并不容易回答这个问题。
标签: javascript asp.net-mvc knockout.js knockout-mapping-plugin