Javascript 在角度模型中,可以在JSON对象和字符串之间切换值类型吗?
我正在处理一个应用程序,它要求我根据关联的Javascript 在角度模型中,可以在JSON对象和字符串之间切换值类型吗?,javascript,json,angularjs,type-conversion,angular-ngmodel,Javascript,Json,Angularjs,Type Conversion,Angular Ngmodel,我正在处理一个应用程序,它要求我根据关联的规则.itemType的值显示各种字段。我遇到的问题是,如果规则.value中的上一个设置值是字符串对象,现在显示需要对象的字段,则我无法修改重复中的模型数据。当我尝试分配新值时,它返回:TypeError:无法分配给ABC123的只读属性'course'。 我确实发现,如果值是对象,它将显示为[对象对象]的字符串,我假设它来自我读到的对象.prototype.toString()函数,如果更改,将用新的字符串对象替换规则.value。即使这个方向可行,
规则.itemType
的值显示各种字段。我遇到的问题是,如果规则.value
中的上一个设置值是字符串
对象,现在显示需要对象
的字段,则我无法修改重复
中的模型数据。当我尝试分配新值时,它返回:TypeError:无法分配给ABC123的只读属性'course'。
我确实发现,如果值是对象
,它将显示为[对象对象]
的字符串
,我假设它来自我读到的对象.prototype.toString()
函数,如果更改,将用新的字符串
对象替换规则.value
。即使这个方向可行,如果我需要对对象执行字符串
,我们最终会回到上述问题
我附上了示例代码,以演示我在下面尝试做的事情以及一些数据。我还对回复者的Plunk进行了分叉、修改和链接,以便您可以看到它的实际操作:
JavaScript:
var app = angular.module('plunker', []);
app.controller('appCtrl', function ($scope) {
$scope.rules = [
{id: 1, itemType: 'CS', value: {course: 'ABC', number: '123'}},
{id: 2, itemType: 'SA', value: 'ABC123'}
];
});
HTML,含Angular v1.3.0:
<body>
<div ng-controller="appCtrl as app">
<div ng-repeat="rule in rules">
Rule {{$index+1}}
<!-- Change the itemType for the rule -->
<select ng-model="rule.itemType">
<option value="SA">String</option>
<option value="CS">Object</option>
</select>
<!-- Fields shown if rule.itemType (SA: String, CS: Object) -->
<input type="text" ng-if="rule.itemType === 'SA'" ng-model="rule.value" />
<span ng-if="rule.itemType === 'CS'">
<input ng-model="rule.value.course" />
<input ng-model="rule.value.number" />
</span>
</div>
</div>
</body>
HTML更改:
<!-- Change the itemType for the rule -->
<select ng-model="rule.itemType" ng-change="changeType(rule)">
<option value="SA">String</option>
<option value="CS">Object</option>
</select>
一串
对象
我真的不明白你的问题,伙计。。。你能具体说明一下你是怎么得到这个错误的吗,因为我没有遇到这个错误。。(也可能是您所在的浏览器)
似乎工作正常,请参见下文
'http://plnkr.co/edit/04huDKRSIr2YLtjItZRK?p=preview'
避免出现问题的一种方法是在rule.itemType更改时显式设置rule.value
这是一个包含调整的工作plunker:
已将以下内容添加到选择列表:
ng-change="typeChange(rule)"
控制器中添加了以下内容:
$scope.typeChange = function(rule) {
if (rule.itemType === 'CS') rule.value = {};
if (rule.itemType === 'SA') rule.value = '';
};
我已经更新并附加了一个更正版本:我更新了代码以包含问题的根源,这是被更改时的itemType,它将显示正确的输入,但不接受值。此外,我还添加了一个plunker。我对问题进行了编辑,以便对手头的主题更清楚一点。我还想说谢谢,我正在阅读你给我的链接,看看它是否能帮助我找到问题的答案。我目前正在试验他们提供的示例代码,等等。看到你关于这一点的推特,我觉得很好。不要担心奇怪的否决票,它们很正常。问题是留给后代的,所以我删掉了投票评论和关于成为新成员的内容。问题最精辟,最能抓住眼前的问题+1啊,好的,谢谢你的提示!我将来会记住这一点。
$scope.typeChange = function(rule) {
if (rule.itemType === 'CS') rule.value = {};
if (rule.itemType === 'SA') rule.value = '';
};