2014-05-21 34 views
1

考虑以下几点:采用了棱角分明包括像MVC谐音

<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> 

上面的代码在案例1,但不是在2种情况:情况1会工作,因为模板使用项目,这是由提供ng-repeat语句不在模板中,情况2不起作用,因为没有项目,而是我希望它使用container.SomeProperty。

也许我滥用角度包括,但我想在ASP.Net MVC中使用它们像partials。在那里,你可以定义一个部分,你可以传入一个模型。

有什么方法可以让我设置什么意味着在模板内?使用马特的答案

问题解决了:

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进入指令,我可以做一个可重复使用的“局部”指令(请告诉我,如果我在这里重新发明轮子?)

回答

0

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

第一个例子,当你添加的部分,也可以指定一个控制器,这需要处理模型的护理:

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这样的路由系统。这里可以看到一个例子,其中某些部分被附加到控制器和特定的URL上:

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