通过使用jQuery,jQuery Mobile的,淘汰赛和萨米requirejs建立与外部模板结构

2019-08-02 23:42发布

我有一个测试应用程序,其中包括require.js,jQuery的,jQueryMobile(JQM),敲除和萨米一个设置

require.js在JQM,敲除和萨米负荷

应用程序主页上我使用萨米加载在淘汰赛的ViewModels。 这些的ViewModels在模板中的负荷..

所以显示代码...

要求页:

require.config({
    jquery:     'vendor/jqm/jquery_1.7_min',
    jqm:     'vendor/jqm/jquery.mobile-1.1.0', 
    knockout: 'vendor/knockout/knockout-2.2.0',
    sammy : 'vendor/sammy/sammy',
    text:       'vendor/require/text',
views:    '../views',
templates:  '../templates'
}

});

define(['app','jqm-config'], function(app) {
   $(document).ready(function() {
  console.log("DOM IS READY");
});    

});

app.js

define(['jquery','knockout', 'sammy','views/home/home', 'views/products/products', 'jqm'],
function($, ko, sammy, appViewModel, productsViewModel) {

var self = this;
self.goHome = function() {
    ko.applyBindings(new appViewModel());
};

self.goProducts = function() {
    ko.applyBindings(new productsViewModel());
};

 Sammy(function() {
    this.get('#home', function() {
       self.goHome(); 
    });

    this.get('#products', function() {
        self.goProducts();
    });

    this.get('', function() {
       self.goHome(); 
    });

 }).run(); 

});

产品页面

define(['jquery', 'knockout','text!templates/test2.html', 'jqm'], 
function($, ko, productsViewTemplate){


function ProductType(id, name) {
var self = this;
self.id = id;
self.name = name;
}

return function productsViewModel() {

  $('body').append(productsViewTemplate); 
  var self = this;
  self.products = ko.observableArray(); 

    var jqxhr = $.getJSON("data/product.json")
    .success(function(data, status, xhr) { 
            self.products.removeAll();    
        $.each(data.data.productTypeList, function(i,item){
           self.products.push(new ProductType(i, item.longName));

        })        
      })
     .error(function() { alert("error"); })
     .complete(function() {

         $.mobile.changePage( '#products', { transition: "pop"});

     });

}
});

产品HTML(text2.html)

<div data-role="page" data-theme="c" class="ui-page" id="products">

<div data-role="header" data-position="fixed">
    <h1>Products</h1>
    <a href="#home" data-icon="home" data-iconpos="notext" data-direction="reverse">Home</a>
</div>

<div data-role="content">   
        <ul data-role="listview" data-inset="true"  data-bind="foreach: products" >

          <li>
            <a data-bind="attr:{href:'#products/list/' + id}, text: name"></a>
          </li>


        </ul>

</div>

有几个问题

  1. 被萨米应该按照这个顺序来加载,因为现在每一次当我刷新它抛出萨米或jQuery是不是由于过于缓慢的加载我猜测定义的错误

  2. 如果有人去从主页上的产品页面上加载OK,因为jQueryMobile changePage被称为但是如果用户然后刷新该页面,即已经从JSON名单失去其所有的造型..

我想这是因为我呈现从模板的页面,然后不得不做出的排行榜,但我想不出这样做的另一种方式的方式。

所以我想(概率不是最好的解决办法),但有没有办法来强制刷新一个pageChange? 或者有没有人有一个更好的解决方案?

3。

这是在外部模板调用的最好方法/有没有更好的方式来追加模板身体。 我真的觉得时间其采取做那是什么导致的造型问题,还当我的产品其开始移动到下一个前呈现他们此页面上的一个新的水平增加..

我在努力寻找与基因敲除和requirejs外部模板加载的最佳方式。 我想保持在HTML模板,让其他人在队中可以编辑很容易够了,给的结构。

这个演示可以在这里看到

http://demo.stg.brightonconsulting.net.au/templates/tests/knockoutJQMProducts/

非常感谢所有帮助

Answer 1:

看着你的演示,我可以建议一些东西去尝试。

  1. main.js删除的依赖jqm-config并把它添加到app.js 。 这样一来,你将永远是保证已经设置了jQuery Mobile的配置在任何事情之前app.js运行。
  2. 确保您的ko.applyBindings()调用包装在.ready()构造。
  3. 您切换页面每一次,你再结合淘汰赛相同的节点。 这不是最好的做法,可能会导致一些奇怪的行为。 如果你要做到这一点,首先要确保不应用绑定。 看看这里 。

即使所有这些项目固定的,我不知道你要去事情的方式会工作。 你可能会更好前面加载所有的HTML和所有页面绑定到一个父视图模型与subviewmodels。



文章来源: performance / templating issues when using requirejs with JQuery, jQuery Mobile, Knockout and Sammy to build a structured app with External Templates