首页 文章

ASP.NET MVC视图中的Knockout绑定

提问于
浏览
1

在我的应用程序中,我们从ASP.NET MVC方法中获取json数据 . 和使用data-bind的绑定视图 . 目前我正在使用Knockout JavaScript库v2.2.1和Knockout Mapping插件v2.3.5 .

因此,每当我加载局部视图时,我必须再次调用相同的绑定方法来绑定局部视图中的属性 .

因此,如果我将knockout库更新为最新版本并再次调用绑定方法,则会抛出以下错误:

未捕获错误:您无法多次将绑定应用于同一元素 .

有没有什么方法可以调用绑定方法一次,然后在部分视图中绑定属性而不调用绑定方法?或者我必须改变使用新的库版本?

方法我目前正在使用绑定数据并在每次加载局部视图时调用

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;
    }
}

1 回答

  • 0

    您可以指定要绑定的DOM元素作为 ko.applyBindings 的第二个参数,而不是绑定到整个屏幕

    避免“未捕获错误:您无法多次将绑定应用于同一元素” . 您可以在partial上为要绑定的数据指定元素id

    ko.applyBindings(LocalizationViewModel, document.getElementById(elementId)
    

    其中 elementId 是局部视图中元素的唯一ID .

相关问题