【问题标题】:Pushing into JSON suddenly not working突然推入 JSON 不起作用
【发布时间】:2015-07-08 11:40:07
【问题描述】:

我是 AngularJS 的初学者,我在推入 JSON 中的数组时遇到问题。 (我希望我使用的是正确的术语)

//I have a JSON that looks like this
var items = [
    {name:[
        {names: 'John', msg:[""]}, {names: 'Dolly', msg:[""]}
            ]}
                ];

以下代码在控制器内部:

$rootScope.items = People.list();
$rootScope.name = "John";

for(var i=0;i<$rootScope.items.name.length;i++)
    {
    if (name== $rootScope.items.name[i].names)
    {   
    People.addcomment(user.comment,i);
    }
    }

以下代码在我的名为“People”的服务中:

this.addcomment = function(comment,x) {
items[0].name[x].msg.push(comment);
}

this.list = function () {   
    return items[0];
}

JSON 在服务中声明。 HTML代码如下:

<textarea placeholder="Enter comment" ng-model="user.comment"></textarea>

<button ng-repeat = "x in items.name" ng-if="name==x.names" 
  ng-click="addcomment(user,name)">Submit</button>

现在,我的问题是,在单击“提交”按钮时,我在 teaxtarea 中输入的“消息”没有存储在与“John”对应的“msg”数组中(在 JSON 中)。出了什么问题?

我之前在 Controller 中拥有了 Service 的完整代码,并且该代码用于正常工作。我想我必须在传递给服务中函数的参数上犯了一些错误。

有人可以帮帮我吗?

【问题讨论】:

  • 我看到您的People 服务有一个返回items[0]list 函数,但您的服务是否返回了list 函数本身?
  • 好的,我不明白你在说什么:) 服务如何返回函数?
  • 没问题。在 AngularJS 中,服务需要返回对象。我将在答案中发布一个示例。
  • 您知道,我在服务中还有其他一些功能,它们似乎都没有给我带来问题。除了将 'comment' 推入 'msg' 数组之外,我可以更改任何一个 'names' 的值,我可以使用 splice() 等。只是这个特殊的东西拒绝工作......
  • 有意思,让我再看看。

标签: javascript html json angularjs ionic-framework


【解决方案1】:

所以你的应用程序的工作流程如下:

  1. 服务被实例化,JSON 存储在你的服务范围内
  2. 控制器被实例化,将数组从 People.List() 复制到 rootScope.items
  3. ng-repeats 对 rooScope.items 中的每个元素重复 - 不是针对 People-service 中 items 数组中的每个元素
  4. 有人输入新消息
  5. 此消息通过 People.addComment 添加到您服务中的项目中。
  6. 第 5 步仅更改服务中的项目,而不更改 rootScope 中的项目。这就是 ng-repeat 不添加新元素的原因。

要使这两个范围保持同步,请向您的控制器添加一个函数:

function updateList() {
    $rootScope.items = People.list();
}

在调用 People.addComment() 后调用此方法。

最后,也许这只是一个观点,你应该改变你的 JSON 结构。如果您像这样设置数据,会更清楚:

var items = [
    {name: 'John', msg:[]}, 
    {name: 'Dolly', msg:[]}
];

现在你有了一个对象数组。您的 People.list() 函数现在返回 items,您可以通过调用 items.push({name: 'Judith', msg:[]}); 添加新人员,您可以使用 items[i].msg.push("This is a new message"); 添加消息

【讨论】:

  • 我实际上是在做 $rootScope.items = People.list();按照您要求的方式在我的控制器中。我只在这里放置了我的整个代码的一部分:) 没有添加评论......可能我在代码的其他地方做错了。不用担心,我会想办法的......
  • 不要记下你的答案,它可能会帮助遇到同样问题的其他人:)
  • 您能发布所有相关的代码片段吗?我很乐意为您提供帮助。
  • 哦,没问题。我修好了..我在循环中放了一个 return 并没有看到它。我粗心:)
猜你喜欢
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
相关资源
最近更新 更多