これは私が今していることです:
http://jsbin.com/EDovILI/1/edit
基本的に、イベントリスナーをコントローラーに貼り付けます。それを行う正しい方法のようには感じませんが、これをどのように抽象化できるかはわかりません
テンプレート:
<div ng-app="app" ng-controller="appController">
<div ng-if="layout == 'big'>...</div>
<div ng-if="layout == 'small'>...</div>
</div>
JavaScript:
function gitReposController($scope, github){
//...
var widthQuery = window.matchMedia("(min-width: 44.375em)");
var setSizeAppropriateTemplate = function (mql) {
if (mql.matches) {
$scope.layout = 'big';
} else {
$scope.layout = 'small';
}
if(!$scope.$$phase) { //prevents it from unnecessarily calling $scope.$apply when the page first runs
$scope.$apply();
}
};
widthQuery.addListener(setSizeAppropriateTemplate);
setSizeAppropriateTemplate(widthQuery);
//...
}
編集/補遺:
コントローラーでイベントリスナーを作成するのは悪い形式ですか? 代わりにディレクティブであるべきですか?それとも振る舞い?
edit : それをディレクティブに変更し、今ではもっと理にかなっていると思います。おそらくもっと良いかもしれません。
http://jsbin.com/EDovILI/4/edit
テンプレート:
<div ng-app="gitRepos" ng-controller="gitReposController" breakpoint="min-width: 44.375em">
<div ng-if="matches">...</div>
<div ng-if="!matches'>...</div>
</div>
JavaScript
app.directive("breakpoint", function () {
return function (scope, element, attrs) {
var breakpoint = attrs.breakpoint;
var mql = window.matchMedia( "(" + breakpoint + ")" );
var mqlHandler = function (mql) {
scope.matches = mql.matches;
if(!scope.$$phase) { //prevents it from unnecessarily calling $scope.$apply when the page first runs
scope.$apply();
}
};
mql.addListener(mqlHandler);
mqlHandler(mql);
};
});