MV*在聚合物,模型和服务中作为聚合物元素?

Ren*_*aud 7 javascript singleton design-patterns angularjs polymer

假设我想要两个视图(聚合物元素)来共享模型.

在Angular中,模型将存在于单个服务中,该服务被注入到视图中,两个视图都从同一个源读取.

我尝试用Polymer模拟这种方法,所以我可以这样做:

<polymer-element name="view1">
  <template>
    <my-model></my-model>
    ...
  </template>
  ...
</polymer-element>

<polymer-element name="view2">
  <template>
    <my-model></my-model>
    ...
  </template>
  ...
</polymer-element>
Run Code Online (Sandbox Code Playgroud)

我喜欢这种方法,因为它是一种定义依赖关系的声明方式,它基本上<core-ajax> 和其他"开箱即用"的Polymer元素一样.

通过这种方式,我需要等待domReady生命周期回调,然后才能与模板中声明的任何元素进行交互,所以这就是我在那里拿着初始化逻辑的地方.问题是,对于<my-model>声明的每个元素,这个回调被调用一次(因此<my-model>在本例中将被初始化两次,因为它存在于<view1>和中<view2>).为了确保我的模型遵循单例模式,我必须将状态移到元素实例之外,如下所示:

 <polymer-element name="my-model">
   <script>
    (function(){
      // private shared state
      var instances = [], registered; // pattern variables
      var foo; // state, model, whatever

      // element init logic
      Polymer('my-model', {
        // Polymer callbacks
        domReady: function(){
          if (registered === (registered=true)) return;
          // singleton init logic
          foo = 'something';
          // event handlers
          this.addEventListener('foo', function(){ foo += 'baz'; });
        },
        attached: function() { instances.push(this); },
        detached: function(){
          instances = instances.filter(function(instance){
            return instance !== this;
          }.bind(this));
        },
        // element API
        update: doSomething,
        get state() { return foo; }
      });
      // private functions
      function doSomething(){ foo += 'bar' }
    })();
  </script>
</polymer-element>
Run Code Online (Sandbox Code Playgroud)

所以它有效,但对我来说看起来不对.使用<polymer-element>通常与单身模式不兼容?我应该离开Polymer以获得模型和服务吗?聚合物核心元素如何逃脱它?

[编辑]我在上面的初始化代码中添加了一些事件监听器.它们仅在一个实例中注册,以避免侦听器跨多个实例多次触发.如果声明事件处理程序的实例被删除会发生什么?那不会破坏异步逻辑吗?

Cai*_*son 1

我会这样:
在主页上定义您的模型并从您的视图中调用它。

如果它被删除,您可以:
1 - 侦听“分离”生命周期回调并在其中强制注册它,或者
2 - 将内容存储在更高级别对象中的原型构建上,并以您最喜欢的方式访问它。
3 - 如果全部失败,(我不确定它会,但我猜因为我还没有使用这种实现,到目前为止我与 php 交谈并传递我需要持久的对象)你可以使用“ prepareForRemoval”知道您将离开实例、本地存储您的东西并执行第 1 项,然后“recoverFromRemoval”如果您知道我所说的驼峰式外壳原型建议的含义

无论如何,我不太喜欢单身人士。Polymer 是强大的前端工具,但我不确定这是最好的方法。

在 API 文档中,他们没有提到将其切断的可能性(如您所见),但我真诚地认为您是对的,您会丢失您的东西。
这只是我的 2 美分,实际上只是我此时此刻提出的一个不优雅的解决方案,也许 @ebidel、@DocDude 或 @dodson 可以在这件事上帮助我们,但你不能真正在这里标记它们,所以我会标记它们在我们的 G+ 上,先生,你让我很感兴趣。
顺便说一句,您为什么要离开主页?在聚合物中没有意义,您应该动态更改内容而不是摆脱它。使用场景是什么?


PS:抱歉,我讨厌专有名词大写。克服它

编辑(不适合评论):

我表达了自己的错误。无论如何,我强烈认为我不明白你想要什么。
好吧,如果我这次做对了,是的,它会多次触发(他们应该这样做),但一旦特定视图被删除,它就不应该将其他视图删除。

至于你的初始化逻辑,我会向窗口或文档添加一个侦听器(我认为窗口更可取)本身等待“聚合物就绪”事件。

“为了确保我的模型遵循单例模式,我必须将状态移到元素实例之外”

恩,那就对了。但不要等待其原型中的 domready,而是使用构造或类似构造并将其称为上述事件侦听器的回调。当我回到家时,我将编辑我的答案以使其更清晰(如果不是,请告诉我)。
我希望你明白我的意思。

如果你不这样做我很快就会回来。