jon*_*aag 0 javascript requirejs backbone.js
嗨我有一个集合和两个视图.在我的view1上我将数据添加到我的集合中,view2将只显示和显示有关集合的任何更改.但我无法让它发挥作用.问题是我原来是这样做的
return new CartCollection();
Run Code Online (Sandbox Code Playgroud)
但他们说这是一个不好的做法所以我删除改变它.但是当我在view1上实例化购物车集合时,它会添加,但似乎view2没有看到更改并且什么都不呈现.
有任何想法吗?
这是我的购物车系列.
define([
'underscore',
'backbone',
'model/cart'
], function(_, Backbone, CartModel) {
var CartCollection = Backbone.Collection.extend({
model : CartModel,
initialize: function(){
}
});
return CartCollection;
});
Run Code Online (Sandbox Code Playgroud)
这是我的itemView(view1)
AddToCart:function(ev){
ev.preventDefault();
//get data-id of the current clicked item
var id = $(ev.currentTarget).data("id");
var item = this.collection.getByCid(id);
var isDupe = false;
//Check if CartCollection is empty then add
if( CartCollection.length === 0){
CartCollection.add([{ItemCode:item.get("ItemCode"),ItemDescription:item.get("ItemDescription"),SalesPriceRate:item.get("RetailPrice"),ExtPriceRate:item.get("RetailPrice"),WarehouseCode: "Main",ItemType : "Stock",LineNum:1 }]);
}else{
//if check if the item to be added is already added, if yes then update QuantityOrdered and ExtPriceRate
_.each(CartCollection.models,function(cart){
if(item.get("ItemCode") === cart.get("ItemCode")){
isDupe = true;
var updateQty = parseInt(cart.get("QuantityOrdered"))+1;
var extPrice = parseFloat(cart.get("SalesPriceRate") * updateQty).toFixed(2);
cart.set({ QuantityOrdered: updateQty });
cart.set({ ExtPriceRate: extPrice });
}
});
//if item to be added has no duplicates add new item
if( isDupe == false){
var cartCollection = CartCollection.at(CartCollection.length - 1);
var lineNum = parseInt( cartCollection.get("LineNum") ) + 1;
CartCollection.add([{ItemCode:item.get("ItemCode"),ItemDescription:item.get("ItemDescription"),SalesPriceRate:item.get("RetailPrice"),ExtPriceRate:item.get("RetailPrice"),WarehouseCode: "Main",ItemType : "Stock",LineNum:lineNum}]);
}
}
CartListView.render();
}
Run Code Online (Sandbox Code Playgroud)
我的购物车视图(view2)
render: function(){
this.$("#cartContainer").html(CartListTemplate);
var CartWrapper = kendobackboneModel(CartModel, {
ItemCode: { type: "string" },
ItemDescription: { type: "string" },
RetailPrice: { type: "string" },
Qty: { type: "string" },
});
var CartCollectionWrapper = kendobackboneCollection(CartWrapper);
this.$("#grid").kendoGrid({
editable: true,
toolbar: [{ name: "save", text: "Complete" }],
columns: [
{field: "ItemDescription", title: "ItemDescription"},
{field: "QuantityOrdered", title: "Qty",width:80},
{field: "SalesPriceRate", title: "UnitPrice"},
{field: "ExtPriceRate", title: "ExtPrice"}
],
dataSource: {
schema: {model: CartWrapper},
data: new CartCollectionWrapper(CartCollection),
}
});
},
Run Code Online (Sandbox Code Playgroud)
问题是你已经创建了2个不同的CartCollection实例.因此,当您将数据更新或获取到一个实例中时,另一个实例不会更改,但保持不变.
相反,您需要在2个视图中使用相同的CartCollection实例(或者保持2个不同步).假设两个视图都在同一个require.js模块中,您需要:
1)实例化CartCollection实例并将其存储在两个视图都可以访问的位置.您可以将它放在路由器,父视图或其他任何地方.例如
var router = Backbone.Router.extend({});
router.carts = new CartCollection();
Run Code Online (Sandbox Code Playgroud)
2)您需要将CartCollection实例传递给每个视图.例如
var view1 = new ItemView({ collection: router.carts });
var view2 = new CartView({ collection: router.carts });
Run Code Online (Sandbox Code Playgroud)
您可能还想将Cart模型传递给CartView而不是整个集合.例如
var cartModel = router.carts.get(1);
var view2 = new CartView({ model: cartModel });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3430 次 |
| 最近记录: |