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 = '';
};