javascript - polymer 中的 MV*,作为 polymer 元素的模型和服务?

标签 javascript angularjs design-patterns singleton polymer

例如,假设我想要两个 View ( polymer 元素)共享一个模型。

在 Angular 中,模型将存在于注入(inject)到 View 中的单例服务中,两个 View 都从同一源读取。

我尝试用 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>

我喜欢这种方法,因为它是一种定义依赖关系的声明方式,而且它的工作原理与 <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>

所以它有效,但对我来说它看起来不对。正在使用 <polymer-element>通常与单例模式不兼容?我应该从 Polymer 转移到模型和服务上吗? Polymer 核心元素是如何逃脱惩罚的?

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

最佳答案

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

如果它被移除,你可以:
1 - 监听“分离的”生命周期回调并在其中强制注册它或
2 - 将内容存储在更高级别对象中的原型(prototype)构建中,并以您最喜欢的方式访问它。
3 - 如果一切都失败了,(我不确定是否会,但我想是这样,因为我还没有使用这种实现,截至目前我与 php 交谈并传递我需要持久化的对象)你可以使用“prepareForRemoval”,知道您将离开实例、本地存储您的东西并执行第 1 步,然后“recoverFromRemoval”如果您知道我所说的驼峰外壳原型(prototype)建议的意思

反正我不是很喜欢单例。 Polymer 是一种强大的前端工具,但我不确定它是否是实现它的最佳方式。

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


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

编辑(不适合评论):

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

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

"To make sure that my model follows the singleton pattern I have to move state outside of the element instance"

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

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

关于javascript - polymer 中的 MV*,作为 polymer 元素的模型和服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26362956/

相关文章:

angularjs - ts2dart 会继续维护吗?

javascript - 表中的 Angular 重复

javascript - Angular $scope 不会在 bootbox 回调中更新

design-patterns - 最不喜欢的设计模式

java - 使用哪种设计模式来实现 "data extenders"?

java - Java 设计模式 : Does this look familiar to anyone?

javascript - 脚本代码片段显示在博客文章摘要中

javascript - 如何仅使用月份名称来使用 MomentJS 设置完整日期?

javascript - 一般如何对 jqGrid 的 loadComplete 和 onSelectRow 进行 pre 和 post 方法调用?

javascript - 使用 Javascript 将 HTML 表格保存为 CSV