【问题标题】:Retrieve localstorage value when value is change in Ionic 2当 Ionic 2 中的值发生变化时检索本地存储值
【发布时间】:2016-07-04 02:29:33
【问题描述】:

我正在使用 ionic 2 框架,并尝试使用本地存储来存储网络状态

this.local = new Storage(LocalStorage);
this.local.set("status", this.status);

有两个值可以动态分配给状态,“强”和“弱”。


我能够在每个页面初始化时获取我的本地存储“状态”值的初始值。

toCheckStatus();
function toCheckStatus()
{
    self.local = new Storage(LocalStorage);
    self.local.get('status').then((value) => 
    {
        console.log("status", value);
    });
}

这将返回一个“强”或“弱”,这正是我想要的,但是否有任何方法或事件可以动态(在“状态”值更改时)调用“toCheckStatus()”函数?

工作流程示例(伪代码):

  1. 在应用程序启动时 -> 检查互联网状态(后台将不断检查并更新本地存储值)
  2. 将状态存储到本地存储
  3. 调用函数获取值(我的值变化时如何动态调用这个函数,有什么方法吗?)
  4. 如果状态为弱 -> 显示弱图标
  5. 如果状态为强 -> 显示强图标

【问题讨论】:

  • 你不也设置值吗?只需在设置状态时更改状态图标即可。
  • @Lifz 嗨 Lifz,是的,我也在更改值,但是当我的图标位于主页上时,值正在后台使用插件进行更改。
  • 如果值在您的应用程序中发生更改,并且您可以控制该值何时更改,则可以触发自定义事件。然后你可以在你的应用程序中监听那个事件
  • @john 嗨,约翰,我可以知道您提到的内容是否有任何简单的示例吗?我很不擅长使用事件监听器..
  • 我自己没有在 Angular 2 中做过,但这里有一个例子:stackoverflow.com/questions/33338276/angular-2-event-broadcast 可能会有所帮助。广播你的价值变化,然后倾听那个变化。

标签: javascript angular typescript ionic2


【解决方案1】:

当我的值发生变化时如何动态调用这个函数,有什么方法吗?

更好的解决方案是使用observables。您可以在方法中使用observables 在属性更改时发出事件,然后执行您需要执行的代码。

这是一个非常简单的使用observables的例子:

import {Injectable} from '@angular/core';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class StorageService {

    private storageObserver: any;
    public storage: any;

    constructor(...) {
        this.storageObserver= null;

        this.storage= Observable.create(observer => {
            this.storageObserver= observer;
        });
    }

    public yourMethod(): void { 

        // This method changes the value of the storage
        // ...

        // Notify to the subscriptor that the value has changed
        this.storageObserver.next(newValue);
    }

然后在你的页面中:

@Component({
  templateUrl: 'build/pages/my-new-page/my-new-page.html',
  providers: [..., StorageService ]
})
export class MyNewPage {

    constructor(..., private storageService : StorageService ) {

        // Initialize all the things you need
        // ... 

        this.storageService.storage.subscribe((newValue) => {
                // This code will execute when the property has changed and also
                // you'll have access to the object with the information that
                // your service sent in the next() call.
                this.doWhatYouWant(newValue);
        });
    }
}

============================================

编辑:

如果您需要更新视图中的某些内容,因为后台发生了更改,您必须让 Angular 知道该更改。一种方法是使用Zones。您可以查看我的答案here 以了解如何操作。

【讨论】:

    【解决方案2】:

    这可以通过 BehaviorSubject 以及 Ionic 的 Storage 模块来实现。

    创建一个 BehaviorSubject,每当您在 Storage 中设置键时调用 .next() 并订阅该 BehaviorSubject 以获取更新的值。

    这样的代码示例:

    let storageObserver = new BehaviorSubject(null)
    
    this.storage.set("key", "data")
    storageObserver.next(null)
    
    setTimeout(() => {
      this.storage.set("key", "new data")
      storageObserver.next(null)
    }, 5000)
    
    storageObserver.subscribe(() => {
      this.storage.get("key")
        .then((val) => console.log("fetched", val))
    })
    

    这将在本地存储中设置一个密钥,该密钥将记录到控制台,并在 5 秒后异步更新该密钥,然后再次记录到控制台。您可以重构键的设置并将 BehaviorSubject 更新为函数。

    【讨论】:

      【解决方案3】:

      投票就足够了吗?这可能不是最干净的方式,但它会获得您需要的数据。

      setInterval(function() {
        // Check localStorage every 2 seconds
      }, 2000);
      

      【讨论】:

      • 谢谢!实际上,我已经在使用间隔来实现这一点,但是我想知道是否还有其他方法可以做到这一点,因为我不希望我的背景继续循环..
      • 有一个storage 事件,但根据规范,它应该只在存储更改时在不是“此”页面的任何页面上触发。我认为他们的想法是,“你正在改变它,当你改变它时做点什么”:)
      猜你喜欢
      • 2018-07-14
      • 1970-01-01
      • 2015-02-14
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多