为什么chooseContent取到的一直是undefined

为什么chooseContent取到的一直是undefined

<!DOCTYPE html>
<html>
<head>
<title>深圳前海二餐厅</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no">
<script>
(function(){
var docEl = document.documentElement;

function setRemUnit(){
// 获取到rem的基准值
var viewWidth = docEl.clientWidth||window.innerWidth;
var rem = viewWidth/10;
// 动态设置HTML根元素的fontsize
docEl.style.fontSize = rem+'px';
};
setRemUnit();
// 窗口大小变化时触发
window.addEventListener('resize',setRemUnit);
// 窗口出现在当前屏幕时(有浏览器兼容性)
window.addEventListener('pageshow',function(e){
if(e.persisted) setRemUnit();
});
})();
</script>
<link rel="stylesheet" href="../lib/reset.css">
<link rel="stylesheet" href="../common/navHeader/navHeader.css">
<link rel="stylesheet" href="../common/headerTab/headerTab.css">
<link rel="stylesheet" href="left/left.css">
<link rel="stylesheet" href="right/right.css">
<link rel="stylesheet" href="shopBar/shopBar.css">
</head>
<body>
<!-- 头部开始 -->
<div class="nav">
<div class="back-icon"></div>
<h4 class="title">深圳前海二餐厅</h4>
</div>
<!-- 头部结束 -->

<!-- 选项卡开始 -->
<div class="tab-bar"></div>
<!-- 选项卡结束 -->

<!-- 点菜内容区开始 -->
<div class="menu-inner">
<div class="left-bar">
<div class="left-bar-inner"></div>
</div>
<div class="right-content">
<p class="right-title"></p>
<div class="right-list">
<div class="right-list-inner"></div>
</div>
<!-- 购物车区域开始 -->
<div class="shop-bar"></div>
<div class="mask hide"></div>
<!-- 购物车区域结束 -->
</div>
</div>
<!-- 点菜内容区结束 -->

<script src="../lib/Zepto.js"></script>
<script src="../common/headerTab/headerTab.js"></script>
<script src="left/left.js"></script>
<script src="right/right.js"></script>
<script src="shopBar/shopBar.js"></script>
</body>
</html>
/* left.js */
(function(){

	// 左侧类目模板字符串
	var itemTmpl = '<div class="left-item">'+
						'<div class="item-text">$getItemContent</div>';+
					'</div>';

    // 请求数据
	function getList(){
		$.get('../json/food.json',function(data){
			window.food_spu_tags = data.data.food_spu_tags||[];
			initContentList(window.food_spu_tags);
		});
	};
	// 渲染item内容 param obj
	function getItemContent(data){
		if(data.icon){
			return '<img class="item-icon" src='+data.icon+' />'+data.name;
		}else{
			return data.name;
		};
	};
	// 渲染列表 param array
	function initContentList(list){
		list.forEach(function(item,index){
			var str = itemTmpl.replace('$getItemContent',getItemContent(item));
			var $target = $(str);
			// 将item数据挂载在left-item上面
			$target.data('itemData',JSON.stringify(item));
			$('.left-bar-inner').append($target);
		});
	};

	function addClick(){
		$('.menu-inner').on('click','.left-item',function(e){
			var $target = $(e.currentTarget);
			$target.addClass('active');
			$target.siblings().removeClass('active');
			// 将数据传给右侧详情列表进行渲染
			window.Right.refresh($target.data('itemData'));
		})
	}

	function init(){
		getList();
		addClick();
	};
	init();
})();
/* right.js */
(function(){

	// 左侧类目模板字符串
	var itemTmpl = '<div class="menu-item">'+
						'<img class="img" src="$picture">'+
						'<div class="menu-item-right">'+
							'<p class="item-title">$name</p>'+
							'<p class="item-desc">$description</p>'+
							'<p class="item-zan">$praise_content</p>'+
							'<p class="item-price">¥$min_price'+
								'<span class="unit">/$unit</span>'+
							'</p>'+
						'</div>'+
						'<div class="select-content">'+
							'<div class="minus"></div>'+
							'<div class="count">$chooseCount</div>'+
							'<div class="plus"></div>'+
						'</div>'+
					'</div>';

    
	// 渲染列表 param array
	function initRightList(list){
		$('.right-list-inner').html('');
		list.forEach(function(item,index){
			if(!item.chooseCount){
				item.chooseCount = 0;
			};
			var str = itemTmpl.replace('$picture',item.picture)
							  .replace('$name',item.name)
							  .replace('$description',item.description)
							  .replace('$praise_content',item.praise_content)
							  .replace('$min_price',item.min_price)
							  .replace('$unit',item.unit)
							  .replace('$chooseCount',item.chooseCount);
			var $target = $(str);
			$target.data('itemData',JSON.stringify(item));
			$('.right-list-inner').append($target);
		});
	};

	// 渲染顶部右侧title
	function initRightTitle(str){
		$('.right-title').text(str);
	};

	function addClick(data){
		$('.menu-item').on('click','.plus',function(e){
			var $count = $(e.currentTarget).parent().find('.count');
			$count.text(parseInt($count.text())+1);
			var $item = $(e.currentTarget).parents('.menu-item').first();
			data.chooseCount+=1;
			window.ShopBar.renderItems();
		});
		$('.menu-item').on('click','.minus',function(e){
			var $count = $(e.currentTarget).parent().find('.count');
			if($count.text()==0){return};
			$count.text(parseInt($count.text())-1);
			var $item = $(e.currentTarget).parents('.menu-item').first();
			data.chooseCount-=1;
			window.ShopBar.renderItems();
		});
	}

	function init(data){
		initRightList(data.spus)||[];
		initRightTitle(data.name)||'';
		addClick(data);
	}
	window.Right = {
		refresh:init
	}
})();
/* shopBar.js */
(function(){

	// 左侧类目模板字符串
	var itemTopTmpl = '<div class="choose-content">'+
						'<div class="content-top">'+
							'<div class="clear-car">清空购物车</div>'+
						'</div>'+
					'</div>';

	var itemBottomTmpl = '<div class="bottom-content">'+
							'<div class="shop-icon">'+
								'<div class="dot-num hide"></div>'+
							'</div>'+
							'<div class="price-content">'+
								'<p class="total-price">¥'+
									'<span class="total-price-span">0</span>'+
								'</p>'+
								'<p class="other-price">另需配送&nbsp;¥'+
									'<span class="shipping-fee-span">0</span>'+
								'</p>'+
							'</div>'+
							'<div class="submit-btn">去结算</div>'+
						'</div>';

   var $strTop = $(itemTopTmpl);
   var $strBottom = $(itemBottomTmpl);

   function renderItems(){
    	$strTop.find('.choose-item').remove();
    	var list = window.food_spu_tags||[];
   		var tmpl ='<div class="choose-item">'+
   						'<div class="item-name">$name</div>'+
   						'<div class="price">¥<span class="total">$price</span></div>'+
   						'<div class="select-content">'+
   							'<div class="minus"></div>'+
   							'<div class="count">$chooseCount</div>'+
   							'<div class="plus"></div>'+
   						'</div>'+
   					'</div>';
   		var totalPrice = 0;
   		list.forEach(function(item,index){
   			item.spus.forEach(function(_item){
   				// 如果有菜品数量大于0就渲染数据
   				if(_item.chooseContent>0){
   					// 计算菜品的总价  单价 * 数量
   					var price = _item.min_price*_item.chooseContent;
   					var row = tmpl.replace('$name',_item.name)
   								  .replace('$price',_item.price)
   								  .replace('$chooseCount',_item.chooseCount)
   					// 计算总价
   					totalPrice+=price;
   					var $row = $(row);
   					$row.data('itemData',JSON.stringify(_item));
   					$strTop.append($row);
   				}
   			})
   		})
   }

	function addClick(data){
		
	}

	function init(data){
		$('.shop-bar').append($strTop);
		$('.shop-bar').append($strBottom);
	}
	init();
	window.ShopBar = {
		renderItems:renderItems
	}
})();


正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好, 

1、 因为你这里引入的是Zepto文件 , zepto的data方法只能存储字符串,所以取得[object, object]。你用JSON.stringify(item)转换过后,看起来是对的, 但是你每次获取字符串是新的,导致可能修改数据不会影响以前的,  建议: 使用jQuery文件, 可以存储对象,这样在修改数据的时候,原来的数据也会发生改变。

http://img1.sycdn.imooc.com//climg/5ceb3a4000010cc410690220.jpg

2、left.js中挂在数据的时候, 直接挂载对象

http://img1.sycdn.imooc.com//climg/5ceb3aa10001b8c211120348.jpg

3、right.js中也直接挂载对象就可以了

http://img1.sycdn.imooc.com//climg/5ceb3aee0001465909740605.jpg

4、right.js中的addClick方法中,传入的data是每次点击左侧导航获取的所有数据, 所以data.chooseCount是给每个左侧导航添加了chooseCount属性, 而不是给spus下的每条数据添加。同学可以自己尝试在这里打印一下data的值查看一下

建议修改: 先获取到数据对象, 然后给这个数据对象设置chooseCount属性

http://img1.sycdn.imooc.com//climg/5ceb3c1f0001426a09870635.jpg

5、right.js中如下图所示部分,应该是在传入参数的时候, 如果没有获取到数据给一个初始值, 你这样虽然不会报错, 不过建议修改了,让代码的书写更符合规范

http://img1.sycdn.imooc.com//climg/5ceb3f31000129dc06560233.jpg

6、shopBar.js中也需要修改为直接挂载对象, 另, 这里的chooseCount单词拼写错误。

http://img1.sycdn.imooc.com//climg/5ceb3eb90001d02c09410637.jpg

打印结果

http://img1.sycdn.imooc.com//climg/5ceb3ed10001d74b15180603.jpg

如果帮助到了你, 欢迎采纳!

祝学习愉快~~~



好帮手慕慕子 2019-05-26 13:36:55

同学你好,你可以参考下图, 修改对应位置的代码试试。

http://img1.sycdn.imooc.com//climg/5cea25660001004611100711.jpg

测试代码

http://img1.sycdn.imooc.com//climg/5cea25d50001fed910530623.jpg

输出结果

http://img1.sycdn.imooc.com//climg/5cea25f20001e10914760735.jpg

如果帮助到了你, 欢迎采纳!

祝学习愉快~~

  • 提问者 悄然于心 #1
    照着老师说的改完后,_item.chooseCount打印出来一直是undefined, 而且视频里老师的 left.js 的 initContentList 函数里面将数据挂载在data属性上时是直接使用的参数item,我照着做最后取值的时候一直是【object object】的字符串,只有用JSON.stringify(item)转换一下才可以,前面提问时别的老师说清除下历史记录,我试了没效果
    2019-05-26 20:10:41
好帮手慕慕子 2019-05-26 11:59:52

同学你好, 因为你在right.js中修改的chooseCount是调用addClick传入的data数据,没有改变原来的数据, 建议修改: 先获取到原来的数据, 在这个基础上进行操作,示例

http://img1.sycdn.imooc.com//climg/5cea0eb200019f8e12050770.jpg

同学可以结合示例代码, 自己下去修改后测试一下效果哦

如果帮助到了你, 欢迎采纳!

祝学习愉快~~~

  • 提问者 悄然于心 #1
    可是我照着老师这样写取到的一直是字符串( obj obj)。。
    2019-05-26 13:25:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师