Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 作为聚合物元件的聚合物、模型和服务中的MV*?_Javascript_Angularjs_Design Patterns_Singleton_Polymer - Fatal编程技术网

Javascript 作为聚合物元件的聚合物、模型和服务中的MV*?

Javascript 作为聚合物元件的聚合物、模型和服务中的MV*?,javascript,angularjs,design-patterns,singleton,polymer,Javascript,Angularjs,Design Patterns,Singleton,Polymer,例如,假设我想要两个视图(聚合元素)共享一个模型 在Angular中,模型将生活在一个注入视图的单例服务中,两个视图都从同一个源读取 我试着用Polymer模拟这种方法,这样我就可以做到: <polymer-element name="view1"> <template> <my-model></my-model> ... </template> ... </polymer-element> &

例如,假设我想要两个视图(聚合元素)共享一个模型

在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>
所以它起作用了,但在我看来是错的。使用
是否通常与单例模式不兼容?我是否应该在模型和服务方面远离聚合物?聚合物核心元素是如何逃脱的

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

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

如果它被移除,您可以:
1-侦听“分离的”生命周期回调,并在其中强制注册或
2-将原型构建中的内容存储在更高级别的对象中,并以您最喜欢的方式访问它。
3-如果所有操作都失败,(我不确定是否会失败,但我想我还没有使用这种实现,现在我与php交谈并传递我需要的持久对象),您可以使用“PrepareForeMoval”,知道您将离开实例,本地存储您的东西,然后执行第1项“RecoverfromRemove”如果你知道我所说的建议是什么意思的话

不管怎样,我不太喜欢单身。聚合物是一种功能强大的前端材料,但我不确定这是最好的方法

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


附言:对不起,我讨厌专有名词大写。算了吧

编辑(不适合评论):

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

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

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

是的,没错。但不要等待domready出现在它的原型中,而是使用一个构造或构造函数,如,并将其作为前面提到的事件侦听器的回调调用。回家后,我会编辑我的答案,让它更清楚(如果不是,请告诉我)。
我希望你明白我的意思


如果您不知道,我很快就会回来。

在浏览器中,window==单例对象的定义。 简单使用:

var window.instances = []; 
var window.registered;
var window.foo;
相反

另一种方法是使用聚合物芯元元素:

  <core-meta id="x-foo" label="foo"></core-meta>
  <core-meta id="x-bar" label="bar"></core-meta>
  <core-meta id="x-zot" label="zot"></core-meta>

  <core-meta id="apple" label="apple" type="fruit"></core-meta>
  <core-meta id="orange" label="orange" type="fruit"></core-meta>
  <core-meta id="grape" label="grape" type="fruit"></core-meta>

  <h2>meta-data</h2>

  <template id="default" repeat="{{metadata}}">
    <div>{{label}}</div>
  </template>

  <h2>meta-data (type: fruit)</h2>

  <template id="fruit" repeat="{{metadata}}">
    <div>{{label}}</div>
  </template>

  <script>

    document.addEventListener('polymer-ready', function() {
      var meta = document.createElement('core-meta');
      document.querySelector('template#default').model = {
        metadata: meta.list
      };

      var fruitMeta = document.createElement('core-meta');
      fruitMeta.type = 'fruit';
      document.querySelector('template#fruit').model = {
        metadata: fruitMeta.list
      };
    });

  </script>

元数据
{{label}}
元数据(类型:水果)
{{label}}
document.addEventListener('polymer-ready',function(){
var meta=document.createElement('core-meta');
document.querySelector('template#default')。模型={
元数据:meta.list
};
var fruitMeta=document.createElement('core-meta');
fruitMeta.type='fruit';
document.querySelector('template#fruit')。模型={
元数据:fruitMeta.list
};
});

对于需要跨多个实例共享状态的元素,这或多或少是我们建议的模式。当事件监听器在一个特定实例中注册,然后该实例被删除时,会发生什么情况?其他实例不会被切断吗?我不会离开我的主页,我所说的视图是指聚合物元素。这些元素通常共存于主页中,其中一些可能被隐藏,但仅此而已。至于直接在主页中定义模型,这将创建循环依赖关系,因为主页需要导入视图,而视图需要反过来导入主页。否则,您如何从视图中获得模型的句柄?编辑了我的答案,因为它不适合注释。让我知道你是否了解我所做的
  <core-meta id="x-foo" label="foo"></core-meta>
  <core-meta id="x-bar" label="bar"></core-meta>
  <core-meta id="x-zot" label="zot"></core-meta>

  <core-meta id="apple" label="apple" type="fruit"></core-meta>
  <core-meta id="orange" label="orange" type="fruit"></core-meta>
  <core-meta id="grape" label="grape" type="fruit"></core-meta>

  <h2>meta-data</h2>

  <template id="default" repeat="{{metadata}}">
    <div>{{label}}</div>
  </template>

  <h2>meta-data (type: fruit)</h2>

  <template id="fruit" repeat="{{metadata}}">
    <div>{{label}}</div>
  </template>

  <script>

    document.addEventListener('polymer-ready', function() {
      var meta = document.createElement('core-meta');
      document.querySelector('template#default').model = {
        metadata: meta.list
      };

      var fruitMeta = document.createElement('core-meta');
      fruitMeta.type = 'fruit';
      document.querySelector('template#fruit').model = {
        metadata: fruitMeta.list
      };
    });

  </script>