使用knockout动态更新Jquery Mobile SPA中的详细信息页面的最佳方法

时间:2015-01-31 04:50:20

标签: jquery jquery-mobile knockout.js

我使用Jquery Mobile构建单页应用程序(SPA),我使用Knockout.js进行模型和数据绑定。在应用程序中,我有一个listview来显示食物菜单。当用户从列表视图中进行选择时,我想打开食物详细信息页面,其中包含有关该项目的详细信息。我已经加载到knockout.js observable Array菜单项和他们的大部分细节..(想想简单的食物卡车菜单)。但我不确定如何动态加载详细信息页面作为单个PAge应用程序......

我应该对服务器进行另一次ajax调用以动态更新详细信息页面。

<a href="myFoodDetailsPage.php?id=3" rel="external">Details</a>

或者是否有一些聪明的方法可以使用我选择的listView项目ID动态更新详细信息页面。换句话说,有没有办法使用knockout.js根据选定的listview项动态构建详细信息页面?

作为SPA开发的新手,我想知道在一个页面内可以动态生成多少这个应用程序..

Jquery移动菜单列表视图(摘录)

    <ul data-bind="foreach: FoodsModelArray"  data-role="listview"  >
    <li >
       <a href="#uib_page_food_details" data-transition="slide">
        <p><strong> <span data-bind="text: food_name"> </span> </p>
        <span data-bind="text: food_desc_abbreviated"> </span> </p>
        <p>Price: <span data-bind="text: food_price">  </span></p>
         </a>   
        </li>
        </ul> <!-- end of list view -->

Jquery移动详情页面

    <!--  start of Food DETAILS page -->          
      <div class="upage" id="uib_page_food_details" data-role="page">

      <div data-theme="a" data-role="header" data-id="main-header">
        //header code would go here
        </div>

    <div data-role="content">
          <form action="#uib_page_food_details" method="get" >

     <div data-role="fieldcontain">
         <fieldset data-role="controlgroup" data-type="horizontal">     
          Chicken Gyro
     Cost: 12.99
    5oz of grilled chicken cutlet on Pita Bread with Tzaiki sauce
    500 calories.
         </fieldset>
        </div>

            <div data-role="fieldcontain">
                <label for="title">Notes:</label>
                <textarea name="notes" id="notes">  </textarea>
            </div>

            <div data-role="fieldcontain">
     <fieldset data-role="controlgroup" data-type="horizontal">
    <legend>Rating:</legend>
    <label for="select-choice-0" class="select">Food Rating:</label>
<select name="select-choice-0" id="select-choice-0">
  <option value="EXCELLENT">EXCELLENT</option>
  <option value="GOOD">GOOD</option>
  <option value="OK">OK</option>
  <option value="POOR">POOR</option>
  <option value="TERRIBLE">TERRIBLE</option>
 </select>
  </fieldset>
 </div>
            <a href="#uib_page_nebu" data-role="button"   data-theme="b" id="btn_update_plate" data-transition="slide" >Update</a>

        </form>
    </div>  

      </div>
<!-- End of FOOD DETAILS page -->    

1 个答案:

答案 0 :(得分:1)

是的,它可以构建到一个页面中。你如何做到这将取决于应用程序的大小,因为你需要管理页面生命周期等。

这是管理主 - 详细视图的一个非常基本的想法:

&#13;
&#13;
var data = [{
    id: 1,
    foodName: 'Pie',
    foodDesc: 'Meat Pie',
    foodPrice: '$4.00'
}, {
    id: 2,
    foodName: 'Chicken Gyro',
    foodDesc: '5oz of grilled chicken cutlet on Pita Bread with Tzaiki sauce 500 calories.',
    foodPrice: '$12.99'
}, {
    id: 3,
    foodName: 'Lamb Roast',
    foodDesc: 'Roast Lamb with gravy',
    foodPrice: '$10.00'
}, {
    id: 4,
    foodName: 'Apple Pie',
    foodDesc: 'Apple Pie with ice cream',
    foodPrice: '$6.50'
}];

var FoodModel = function (data) {
    var self = this;
    self.id = data.id || 0;
    self.food_name = ko.observable(data.foodName || '');
    self.food_desc_abbreviated = ko.observable(data.foodDesc || '');
    self.food_price = ko.observable(data.foodPrice || '$0.00');
    return self;
}
var Vm = function () {
    var self = this;
    self.selectedItem = ko.observable(null);
    self.foodsModelArray = ko.observableArray($.map(data, function (item){return new FoodModel(item);}));

    self.selectItem = function (item) {
        alert('load data here for item ' + item.food_name() );
        self.selectedItem(item);
    }
    self.clearSelection = function(){
        self.selectedItem(null);
    }
    self.detailVisible = ko.pureComputed(function(){
        return self.selectedItem() !== null;
    });
    self.listVisible = ko.pureComputed(function (){
        return self.selectedItem() === null;
    });
    return self;
}

ko.applyBindings(new Vm());
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<ul data-bind="foreach: foodsModelArray, visible: listVisible" data-role="listview">
    <li> <a data-transition="slide" data-bind='click: $parent.selectItem'>
        <p><strong> <span data-bind="text: food_name"> </span> </p>
        <span data-bind="text: food_desc_abbreviated"> </span> </p>
        <p>Price: <span data-bind="text: food_price">  </span></p>
         </a> 
    </li>
</ul>
<!-- end of list view -->
<!-- start of Food DETAILS page -->
<div class="upage" id="uib_page_food_details" data-role="page" data-bind="with: selectedItem, visible: detailVisible">
    <div data-theme="a" data-role="header" data-id="main-header" data-bind="text: food_name">//header code would go here</div>
    <div data-role="content">
        <form action="#uib_page_food_details" method="get">
            <div data-role="fieldcontain">
                <fieldset data-role="controlgroup" data-type="horizontal"><span data-bind='text: food_desc_abbreviated'></span>
                </fieldset>
            </div>
            <div data-role="fieldcontain">
                <label for="title">Notes:</label>
                <textarea name="notes" id="notes"></textarea>
            </div>
            <div data-role="fieldcontain">
                <fieldset data-role="controlgroup" data-type="horizontal">
                    <legend>Rating:</legend>
                    <label for="select-choice-0" class="select">Food Rating:</label>
                    <select name="select-choice-0" id="select-choice-0">
                        <option value="EXCELLENT">EXCELLENT</option>
                        <option value="GOOD">GOOD</option>
                        <option value="OK">OK</option>
                        <option value="POOR">POOR</option>
                        <option value="TERRIBLE">TERRIBLE</option>
                    </select>
                </fieldset>
            </div> 
            <a data-role="button" data-theme="b" data-transition="slide" data-bind="click: $parent.clearSelection">Back</a>
            <a href="#uib_page_nebu" data-role="button" data-theme="b" id="btn_update_plate" data-transition="slide">Update</a>
&#13;
&#13;
&#13;