AngularJS模板切换

AngularJS模板切换,angularjs,adaptive-design,Angularjs,Adaptive Design,我们的客户想要一个响应迅速的网站,但他想改变和移动太多的内容,我们将遇到引导限制 使用引导,您可以显示和隐藏块,并使用偏移量移动它们,但它有其局限性。这是一个苛刻的客户,不会尊重这些限制,所以我们正在寻找其他选择 为了避免创建重复内容,并且仍然能够提供移动/桌面体验,我们的团队提出了AngularJS 我们的JSON数据和角度控制器可以保持不变,但我们只需要在移动/平板/桌面上切换视图 有没有一个好的稳定的解决方案来让它工作? 我们是否可以像通过调整浏览器大小来测试响应性设计那样进行测试,或者用

我们的客户想要一个响应迅速的网站,但他想改变和移动太多的内容,我们将遇到引导限制

使用引导,您可以显示和隐藏块,并使用偏移量移动它们,但它有其局限性。这是一个苛刻的客户,不会尊重这些限制,所以我们正在寻找其他选择

为了避免创建重复内容,并且仍然能够提供移动/桌面体验,我们的团队提出了AngularJS

我们的JSON数据和角度控制器可以保持不变,但我们只需要在移动/平板/桌面上切换视图

有没有一个好的稳定的解决方案来让它工作? 我们是否可以像通过调整浏览器大小来测试响应性设计那样进行测试,或者用户代理检测是唯一的解决方案?
这将是测试过程中的一个难题,因为我们需要很多设备或模拟器进行测试。

您可以为此创建自定义指令

app.directive('responsiveTemplate', function() {
    return {
        restrict: 'E',
        template: '<ng-include src="template"></ng-include>',
        scope: true,
        link: function(scope, elem, attr) {
            var mobile = attr.mobile;
            var desktop = attr.desktop;
            scope.template = desktop;

            $(window).resize(function() {
                if (windowSizeIsDesktop() && scope.template != desktop) {
                    scope.template = desktop;
                    scope.$apply();
                }
                else if (windowSizeIsMobile() && scope.template != mobile) {
                    scope.template = mobile;
                    scope.$apply();
                }
            });
        }
    }
})
app.directive('responsiveTemplate',function(){
返回{
限制:'E',
模板:“”,
范围:正确,
链接:功能(范围、要素、属性){
var mobile=attr.mobile;
var desktop=attr.desktop;
scope.template=桌面;
$(窗口)。调整大小(函数(){
if(windowSizeIsDesktop()&&scope.template!=桌面){
scope.template=桌面;
作用域:$apply();
}
else if(windowsizesmobile()&&scope.template!=mobile){
scope.template=mobile;
作用域:$apply();
}
});
}
}
})
用作元素

<responsive-template desktop="desktop.html" mobile="mobile.html"></responsive-template>


我还没有定义
windowSize
函数,尽管它们实现起来很简单我可能会使用ng if,但我会确保您首先需要它,并且不能简单地使用css/媒体查询来查询您所描述的内容。以下是ng if逻辑的一个示例:

<body ng-app="myApp"> 
   <div ng-controller="ctrl" >
      <div ng-if="isWide()">
         <p>Wide Content</p>
      </div>
      <div ng-if="!isWide()">
          <p>Narrow Content</p>
      </div>
   </div>
</body>

只需拖动拆分窗格即可在小提琴中查看结果

$routeProvider.
 when('/:menu/:page', {
     controller:HandleCtrl,
     template:'<div ng-include="templateUrl">Loading...</div>'
 }).
这样安全吗?
在控制器内部,我可以决定要使用什么html文件作为模板

谢谢,这几乎就是我们要寻找的。但不是真正分开的模板。BackboneJS可能是更好的选择?“Angular使用视图派生行为,而Backbone使用行为驱动视图”我认为这不是Angular的真实说法。我也不太明白这和你的问题有什么关系。也许如果您用一些代码示例更新您的问题,我可以帮助您获得更好的解决方案。我不建议你为(我认为)你正在描述的问题选择一种新技术,除非你在该技术方面有更多的经验……问题是,我们希望避免在一个视图中混合使用移动和桌面内容块。您的容器保持在同一位置。无论你使用什么设备。移动和桌面模板在块顺序上完全不同,因此切换到一个全新的视图文件会更好。在黑暗中拍摄,因为我仍然不清楚你在追求什么,但是我已经更新了jsfiddle:-如果您希望摆脱该div,可以将ng控制器移动到body标记,并且可以在ng include中与ng if一起定义不同的视图。在这一点上,它与下面的解决方案非常相似,但对于移动/桌面,它有完全不同的路线,我认为这是一个SEO噩梦。您还可以使用matchMedia(),这类似于javascript的css媒体查询。这样,您就不必绑定到调整大小事件。
$routeProvider.
 when('/:menu/:page', {
     controller:HandleCtrl,
     template:'<div ng-include="templateUrl">Loading...</div>'
 }).
function HandleCtrl($scope, $routeParams){
 $scope.templateUrl = $routeParams.menu +'/'+ $routeParams.page + '.html'
}