使用角度包括像mvc partials

时间:2014-05-21 05:36:43

标签: angularjs

请考虑以下事项:

<script type="text/ng-template" id="myTemplateName">
{{item.SomeProperty}}
<script>

<div ng-repeat="container in List">
    <div ng-repeat="item in container.Items">
        <!-- CASE 1 -->
        <div ng-include="'myTemplateName'"></div>
    </div>    
    <!-- CASE 2 -->
    <div ng-include="'myTemplateName'" />
</div>

上面的代码适用于case1,但不适用于case2:案例1将起作用,因为模板使用 item ,该模板由模板外的ng-repeat语句提供,case 2不不行,因为没有项目,而我希望它使用container.SomeProperty。

也许我误用了角度包含,但我想在ASP.Net MVC中使用它们像partials一样。在那里,您可以定义部分,并且您可以传入模型。

是否有任何角度允许我设置在模板中的含义?

使用Matt的答案解决了问题:

module.controller("ItemController", ['$scope', function ($scope) {
    $scope.templateitem = ($scope.$parent.item) ? $scope.$parent.item : $scope.$parent.$parent.container.Item;
}]);

但是,感觉有点脏:控制器需要知道如何使用它。如果我能从外面将它传递给控制器​​会更好。

更好的方法:

我真的不喜欢上面的解决方案,因为控制器需要知道它将如何使用,所以我使用了一个指令:

app.directive("opportunity", function () {
    return {
        restrict: "E",
        templateUrl: "opportunityTemplate",
        scope: { templateitem: "=model" }
    };
});

在视图中:

<script type="text/ng-template" id="opportunityTemplate">
    {{templateitem.SomeProperty}}
</script>

<opportunity model="container.Item"></opportunity>
<opportunity model="somethingElse.Item"></opportunity>

现在我需要知道的是我如何将templatename传递给指令,并且我可以制作一个可重复使用的“部分”指令(请告诉我,如果我在这里重新发明轮子?)

1 个答案:

答案 0 :(得分:0)

您需要使用的是ng-controller,或某些路由系统,如ui-router,通过路由定义将部分连接到控制器。

对于第一个示例,当您添加partial时,还要指定一个负责处理模型的控制器:

HTML:

<div ng-controller="MyCtrl" ng-include="'myTemplateName'" />
<!-- inside the template -->
<div>{{item.somekey}}</div>

控制器:

angular.module('myapp.ctrl', [])
.controller('MyCtrl', ['$scope', function($scope){
        $scope.item = { somekey: 'somevalue' };
    }]);

在第二个示例中,使用路由系统,如ui-router。这里可以看到一个例子,其中某些部分附加到控制器和特定网址:

https://github.com/angular-ui/ui-router/tree/gh-pages/sample