Javascript 谷歌浏览器和IE浏览器的不同之处

Javascript 谷歌浏览器和IE浏览器的不同之处,javascript,google-chrome,internet-explorer,knockout.js,requirejs,Javascript,Google Chrome,Internet Explorer,Knockout.js,Requirejs,我的应用程序使用knockout.js自定义元素。在google chrome和internet explorer中,viewmodel和模板的加载顺序不同 在我的web应用程序中,我定义了许多自定义元素,如: ko.components.register('account-management-me', { viewModel: { require: 'Scripts/app/components/accountManagementMe/ViewModel' },

我的应用程序使用knockout.js自定义元素。在google chrome和internet explorer中,viewmodel和模板的加载顺序不同

在我的web应用程序中,我定义了许多自定义元素,如:

ko.components.register('account-management-me', { viewModel: { require: 'Scripts/app/components/accountManagementMe/ViewModel' }, template: { require: 'text!Scripts/app/components/accountManagementMe/' + language + 'View.html' } }); ko.组件注册(“账户管理-me”{ viewModel:{require:'Scripts/app/components/accountManagementMe/viewModel'}, 模板:{require:'text!Scripts/app/components/accountManagementMe/'+language+'View.html'} }); 使用Internet Explorer,我观察到以下加载顺序:

  • ViewModel.js
  • enView.html
  • 对于Chrome,我观察到以下加载顺序:

  • enView.html
  • ViewModel.js
  • 因此,
    ViewModel.js
    视图中绑定的字段是未定义的,敲除会引发异常

    有没有办法影响负载顺序

    有没有办法影响负载顺序

    是的,如果将组件注册为单个模块,则可以将其设置为使视图模型依赖于模板,从而始终在加载视图模型之前加载模板

    Knockout使用RequireJS加载视图模型和模板。如文档中所述,它会发出一个普通的
    require
    调用,调用的模块名为
    ko.components.register
    。对于您的代码,等效的
    require
    调用是:

    require(['Scripts/app/components/accountManagementMe/ViewModel'], callback);
    require(['text!Scripts/app/components/accountManagementMe/enView.html', callback);
    
    这两个调用不能约束加载顺序。
    ../ViewModel
    是第一位并不重要。(实际上,它可能是第二个)这两个调用都是异步的,可以以任何顺序解析,除非模块使用
    define
    建立一个对另一个的依赖关系。这就是RequireJS的工作原理。如果没有明确的依赖关系,则顺序是不确定的,并且可能因浏览器内部结构、网络条件等而有所不同

    要将组件注册为单个模块,请执行以下操作:

    ko.components.register('account-management-me', 
      { require: 'Scripts/app/components/accountManagementMe/ViewModel' });
    
    上面提到的模块将包含如下内容:

    define(['knockout', 'text!Scripts/app/components/accountManagementMe/enView.html'], function(ko, template) {
        function ViewModel() {
        }
    
        ViewModel.prototype.foo = function() { ... };
    
        return { viewModel: ViewModel, template: template };
    });
    

    在本例中,我将模板模块名设置为静态字符串。您希望根据配置的语言加载不同的模板,但不支持将运行时计算的字符串放入
    define
    的依赖项中。您可以让它在一些琐碎的情况下工作,但如果您想使用
    r.js
    优化模块,它将阻塞计算字符串。要获得对语言的支持,应使用。或者提供类似功能的东西。关于如何使用它有很多问题,如果在设置i18n时遇到问题,您可以查看这些问题。

    假设您返回了服务器数据,然后绑定了视图模型并创建了html(理想情况下),您可以将您的html模板包装在
    包装器中,直到
    ifDataPresent
    observable具有一个布尔值
    true
    值,该值来自服务器,或者在获取数据后手动分配,并且可以进行绑定,它才会构建您的html模板……您还可以提供一些解释吗关于为什么不同浏览器的加载顺序会有这样的差异?谢谢…编辑。请参阅以“Knockout正在使用RequireJS加载[…]”开头的段落