0

我创建了一个本地存储服务,看起来像这样

import Ember from 'ember';
import ENV from 'bidr/config/environment';

const stringify = JSON.stringify;
const parse = JSON.parse;

function setItem(key, value) {
  localStorage.setItem(key, stringify(value));
}

function getItem(key) {
  var result = localStorage.getItem(key);
  if (result) {
    return parse(result);
  }
}


export default Ember.Service.extend({
  namespace: ENV.APP.LocalStorageKey,
  user: null,

  init: function() {
    this.set('user',this.getItem('user'));
  },

  setItem: function (key, object) {
    var ttlOptions = arguments[2];

    if (ttlOptions) {
      this._setTTLKey(key, ttlOptions);
    }
    this.set(key,object);
    setItem(this._namespacedKey(key), object);
  },
  getItem: function (key) {
    return getItem(this._namespacedKey(key));
  },
  keyExpired: function (key, now) {
    var ttl = this.getItem(`_ttl_${key}`);
    if (ttl) {
      var expiry = new Date(ttl.lastUpdated)
          .setTime(new Date(ttl.lastUpdated)
          .getTime() + ttl.ttl);

      now = now || new Date();

      return now > expiry;
    }
    return true;
  },
  _setTTLKey: function (key, ttlOptions) {
    var dateTime = new Date();
    setItem(this._namespacedKey(`_ttl_${key}`),
      {ttl: ttlOptions.ttl, lastUpdated: dateTime}
    );
  },
  _namespacedKey: function (key) {
    return this.get('namespace') + `.${key}`;
  }
});

用户对象是这样我可以直接在模板中访问它或作为计算的属性值。

问题是另一个依赖于user服务中属性的计算属性在更改时没有得到通知。在我的应用程序控制器中,我有一个操作可以更新user服务中属性的属性

updateActiveEvent(eventInfo) {
    var currentUserInfo = this.get('localStorage').getItem('user');
    currentUserInfo.active_auction = eventInfo.eid;
    this.get('localStorage').setItem('user',currentUserInfo);
},

(这来自套接字服务)这工作正常,因为在此操作触发后,我可以检查浏览器的 localstorage 对象并查看active_auction它的属性已更改。但是在我显示该(或基于该计算的属性)的模板中,它没有更新。

我看到可能有一种方法可以强制 ember 通知属性更改,但似乎无法让它工作,不确定我是否做得对。

4

0 回答 0