【问题标题】:Setting a variable out of a confusing method in Angular JS在 Angular JS 中使用令人困惑的方法设置变量
【发布时间】:2017-10-08 11:07:18
【问题描述】:

所以我有一个名为stuff 的变量,它被声明为stuff:any,我想用我从中获得的数据填充它:

this.http.post("WORKING_IP_ADDRESS", JSON.stringify(
      {"thing1": this.thing1,
      "thing2": this.thing2,
    }), {headers: headers}).map(
      res => res.json()).subscribe(
        data => {
          (JSON.stringify(data));
        })

当我在最后一个 JSON.stringify(data)); 上运行 alert() 方法时,我得到了我想要的数据,但是当我尝试通过执行 this.stuff = JSON.stringify(data)); 将它设置为等于 stuff 变量时,它没有工作。我是 Angular 的新手,所以我知道我可能做错了什么。有谁知道我需要做什么才能将最终的 JSON.stringify(data) 放入我的 stuff 变量中?

【问题讨论】:

    标签: angularjs json http ionic-framework


    【解决方案1】:

    原因是 http.post 是一个 observable。这意味着它会在以后解决。它稍后会解决,因为它需要一些时间来连接到该工作 IP 地址、获取数据并对其进行处理。

    想象一下这样的场景

    let stuff = 'no';
    
    // Equal to http.post
    const resolvesLater = setTimeout(function() {
        stuff = 'yes';
        console.log(stuff);
    },2000);
    
    console.log(stuff);
    

    https://jsfiddle.net/7c6kfurp/ 打开控制台并按下播放键。看看会发生什么。

    你会认为控制台看起来像 是的 是的

    但实际上会 不 是的

    因为 setTimeout 中发生的事情稍后会发生。所以行的顺序并不能告诉你代码执行的顺序。

    • 它会在开头设置 stuff = 'no'。
    • 然后进入 setTimeout/http.post 函数
    • 这需要一些时间。
    • 同时浏览器继续
    • 它会注销一些东西(仍然没有)
    • 然后 setTimeout/http.post 解析
    • 它会设置东西 = 是的
    • 然后注销一些东西(现在可以了)

    在 Angular 2 中,您订阅了 observables(就像您所做的那样),但最好将 fetch 和 subscribe 解耦。所以创建一个带有函数的服务:

    fetchStuff(): Observable<Stuff[]> {
            return his.http.post("WORKING_IP_ADDRESS", JSON.stringify({
                "thing1": this.thing1,
               "thing2": this.thing2,
           }), {headers: headers}).map(res => res.json());
        }
    

    然后你订阅它并为视图分配 stuff 变量

    getStuff() {
        this.MyService.fetchStuff()
            .subscribe(stuff => this.stuff= stuff);
    }
    

    最后在你看来

    <ul class="items">
        <li *ngFor="let item of stuff>
            <span>{{item.property}}</span>
        </li>
    </ul>
    

    Observables 意味着当对象发生变化时,所有其他依赖于它的对象都会得到通知。

    所以你向你的工作 IP 发出请求,首先什么都没有发生,就像我上面解释的那样。我们正在等待服务器响应,因此您发送的数据有一些东西,然后给您发回一些东西。

    为了知道某事何时发生,您订阅它。就像您订阅报纸以获取最新消息一样。当有事情发生时,您会收到通知。您想知道何时收到来自 the-working-ip 的响应。

    我拆分它的原因是为了分离获取和订阅,只是为了分离关注点。你不必这样做,我可能让你更困惑。为......感到抱歉。

    试试这个:

    this.http.post("WORKING_IP_ADDRESS", {
        "thing1": this.thing1,
        "thing2": this.thing2
    }, {headers: headers})
    .map(res => res.json())
    .subscribe(data => this.stuff = data);
    

    这是一个关于如何创建服务的链接 https://angular.io/docs/ts/latest/guide/server-communication.html

    【讨论】:

    • 这有帮助,但是我如何捕获 http.post 返回的内容?
    • 更新了一些例子,但经过一番谷歌搜索后,这个人解释得更好:stackoverflow.com/questions/34671715/…
    • 对不起,我对服务和订阅内容有点困惑。我不完全知道如何创建服务或从哪里获取 fetchData(),而其他任何地方都没有提到它。
    • 是的 fetchData 是一个错字,抱歉,这一切都变成了数据数据之类的东西;)我已经更新了我的答案。希望这会有所帮助。
    • 所以我想出了如何让服务运行,当我点击一个按钮时我的事件发生了,但是,当我第一次点击它时,我得到undefined,但是当我点击它时我第二次得到我希望的stuff。知道现在出了什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2019-05-23
    相关资源
    最近更新 更多