AngularJS browser autofill workaround revisited

January 05, 2014

在經歷過了 AngularJS browser autofill workaround by using a directive 之後過了幾週,有一天我嘗試對著 login 用的表單亂來(?),發現上的 workaround 其實只能針對在頁面一載入時的自動填入,如果是先清除它,在經過人為的操作之後的自動填入,還是都抓不到… (畢竟 $timeout 只用了一次當然…)

revisit

既然一次的 $timeout 不夠用,而現在要解決的情況就是它「隨時」會在 AngularJS 預設無法察覺的情況下被填入資料,我想最直覺的選擇就是改跑 interval 了。

$interval

在 AngularJS 1.2.0 之後加入了 $interval 這個 service,使用上要注意的是它預設每一個 tick 都會觸發一次 $digest,而我現在其實並不希望每個 tick 都觸發,而是在真的有被自動填入之後。

因此這邊在 $interval 的第四個參數帶入 false,讓它不會自動做 $apply() 的動作,靠我判斷後再決定是否 $apply()

/* file: auto-fill-sync.js */

app
.directive('autoFillSync', function($interval) {
  return {
    require: 'ngModel',
    link: function(scope, elem, attrs, ngModel) {
      var INTERVAL_DELAY = 100;
      
      var intervalPromise;
      intervalPromise = $interval(function () {
        var newVal = elem.val();
        if (ngModel.$viewValue !== newVal) {
          scope.$apply(function () {
            ngModel.$setViewValue(newVal);
          });
        }
      }, INTERVAL_DELAY, 0, false);

      elem.bind('$destroy', function () {
        $interval.cancel(intervalPromise);
      });
    }
  };
});

$window.setInterval

其實應該很多人已上線的產品都還沒有升到 1.2.x (或著還在 1.0.x),在沒有 $interval 可以用的情況下,用 $window.setInterval 來擋一下也是合情合理的。

/* file: auto-fill-sync.js */

.directive('autoFillSync', function($window) {
  return {
    require: 'ngModel',
    link: function(scope, elem, attrs, ngModel) {
      var INTERVAL_DELAY = 100;

      var intervalHandle;
      intervalHandle = $window.setInterval(function () {
        var newVal = elem.val();
        if (ngModel.$viewValue !== newVal) {
          scope.$apply(function () {
            ngModel.$setViewValue(newVal);
          });
        }
      }, INTERVAL_DELAY);

      elem.bind('$destroy', function () {
        $window.clearInterval(intervalHandle);
      });
    }
  };
});

後記

自動完成實在太方便了… 請務必一定要讓你的 AngularJS app 支援啊!

ngQueue v0.1.0 released!

January 01, 2014

https://github.com/pc035860/ngQueue/releases/tag/v0.1.0

The very first release.

其實關於 ngQueue,早在 用 ngQueue 來完成需要排隊的非同步工作 就已經有介紹過用法了。不過當時在 GitHub 的 release 頁面 上並沒有 tag 任何一次的 release,所以這次才算是真正的第一次 release 啦~

本來是想說反正別人使用的需求也不大,我做 release 只是加上 GitHub tag 之後用 bower 對一些人的開發流程來說比較方便而已… 這次也就是因為我的下一個 module 有這個 ngQueue 的 dependency 需求,求個方便控管 dependency 之餘也就順便把 ngQueue release 好了。

當然也不是什麼都沒改就 release,這樣也太沒誠意。

為了下一個 module,ngQueue$queueFactory 新增了 deferred 這個只加了幾行 code 但其實非常厲害的選項(都我在講)。原本為了加這個選項還有新的 queue API remove(),我天花亂墜地寫了一群 code,最後全部砍光光了(爆頭)…

總之也請期待下一個 module!

angular-easyfb v0.2.2 released!

January 01, 2014

https://github.com/pc035860/angular-easyfb/releases/tag/v0.2.2

  • setInitFunction() in configure block for initialization customization
  • Make $FB.Event.unsubscribe unsubscribes events properly

2014 的第一天修掉了一個可怕的 bug。

之前照著人家回報的 issue 做了一個 plunk,意外發現 $FB.Event.unsubscribe 竟然沒有作用(雖然那 issue 不是回報這個),查了 Facebook 的 doc 才發現 FB.Event.unsubscribe 需要帶上原本 call FB.Event.subscribe 時用的 listener function 才能夠順利運作。

老實說以目前的 implementation 要讓這件事可以 work 還蠻玄妙的,總之還是改好了 YA! FB.Event 應該算是蠻常用到的 API ,出 bug 真是太可怕了…

Chrome extension: 熬過了那些歷歷在目的千辛萬苦,我最後終於獲得了一些 event page 的小知識

December 27, 2013

難得用一下類輕小說標題,真的有夠長…

話說從頭

我在去讀 doc 的第一天就看到了下面這段 Event Pages 的介紹(來源)

Event pages are available in the stable channel as of Chrome 22, and the performance advantages are significant, especially on low-power devices. Please prefer them to persistent background pages whenever possible for new development and begin migrating existing background pages to this new model.

於是我就一股惱的直接栽進 event page 裡啦~~~

官方文件

官方文件裡面用了為數不少的 load, loaded 等詞,來敘述 event page 的載入狀態,但就我個人經過實驗後的理解,其實官方文件所謂的 loaded 狀態是有玄妙的。

也因此閱讀官方文件讓我感到相當迷惑。

如果你覺得下面寫得不夠清楚,你也可以直接閱讀官方文件

Read on 

angular-easyfb v0.2.1 released!

December 25, 2013

https://github.com/pc035860/angular-easyfb/releases

Changelog

  • setLocale() in configure block
  • Configure FB.init parameters with $FB.init in run block

這次的 release 內容完全來自 pull request,也確實是很實際的需求。 在這 star 數即將破百的時刻真是令人感動!