【问题标题】:How to data-bind an mvc partial view using angularjs directives如何使用 angularjs 指令对 mvc 局部视图进行数据绑定
【发布时间】:2015-08-05 15:15:47
【问题描述】:

我有以下 angularjs 指令:

app.directive("partnersInfoView", function ($http) {
    return {
        restrict: 'A',
        link: function ($scope, element) {
            $http.get("/home/PartnerInfoTab") // immediately call to retrieve partial
              .success(function (data) {
                  element.html(data);  // replace insides of this element with response
              });
        }
    };
});

这基本上是一个 MVC 控制器并返回一个局部视图

public ActionResult PartnerInfoTab()
{
    return PartialView("../ManagePartners/PartnerInfoTab");
}

在父视图中我有以下声明:

<div id="genericController" ng-controller="GenericController">
    <div partners-info-view></div>
</div> 

使用 angular 指令来渲染局部视图,到目前为止一切正常。在我的 angular genericController 内部,我有一个范围变量:

$scope.Data = data;

其中数据是作为来自 Rest 服务的响应的 json 对象

Json 响应,例如

{[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

我遇到的问题是我无法在指令模板中绑定 $scope.Data 变量:

 <div id="PartnerInfoTab">
    <div class="form-group">
        <label class="col-md-2 control-label">Name</label>
        <div class="col-md-8">
            <input id="txt_name" class="form-control" type="text" ng-model="Data.firstName">
        </div>
    </div>
</div>

我的问题是,如何将父范围传递给 angular 指令,以便能够对部分视图中的元素进行数据绑定。我错过了什么??

提前致谢。

【问题讨论】:

    标签: angularjs model-view-controller partial-views


    【解决方案1】:

    我没有看到使用 $http.get 手动获取模板然后将其插入 DOM 的任何用途。你可以简单地在指令配置中给出templateUrl 值,Angular 会获取模板并为你编译。

    app.directive("partnersInfoView", function ($http) {
         return {
               restrict: 'A',
               templateUrl: '/home/PartnerInfoTab',
               link: function (scope, element, attr) {
                   // Do linking
               }
         };
    });
    

    而且,您的 partnersInfoView 不会创建隔离范围。因此,您可以访问partnersInfoView 的父范围值的值。请参阅下面的 sn-p。

    var app = angular.module('app', []);
    
    app.run(function($templateCache) {
      // Simulating the fetching of /home/PartnerInfoTab template
      var template = '<div id="PartnerInfoTab">' +
        '<div class="form-group">' +
        '<label class="col-md-2 control-label">Name</label>' +
        '<div class="col-md-8">' +
        '<input id="txt_name" class="form-control" type="text" ng-model="Data[0].firstName">' +
        '<input id="txt_name" class="form-control" type="text" ng-model="Data[1].firstName">' +
        '<input id="txt_name" class="form-control" type="text" ng-model="Data[2].firstName">' +
        '</div>' +
        '</div>' +
        '</div>';
    
      $templateCache.put('/home/PartnerInfoTab', template);
    });
    
    app.controller('GenericController', function($scope) {
      $scope.Data = [{
        "firstName": "John",
        "lastName": "Doe"
      }, {
        "firstName": "Anna",
        "lastName": "Smith"
      }, {
        "firstName": "Peter",
        "lastName": "Jones"
      }];
    });
    
    app.directive("partnersInfoView", function($http) {
      return {
        restrict: 'A',
        templateUrl: "/home/PartnerInfoTab",
        link: function($scope, element) {
          // linking
        }
      };
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="app">
      <div id="genericController" ng-controller="GenericController">
        <div partners-info-view></div>
      </div>
    </div>

    【讨论】:

    • 谢谢你是对的,不需要调用$http.get,但仍然无法访问父范围,我只能访问部分视图中的根范围,但这不是什么我想要。还有其他想法吗?
    • 您没有在指令内创建隔离范围,因此您应该能够访问 partnersInfoView 指令的父范围
    • 谢谢,它现在就像一个魅力,最后问题有点不同,因为我省略了它在引导模式中使用的自定义指令。但你的回答真的很有帮助,解决了最初的帖子。
    【解决方案2】:

    您缺少的可能是您的模板的compilation。您需要做的是在您的success 处理程序中使用$compile 服务:

    .success(function (data) {
        var linkingFunction = $compile(data); // compile template
        var linkedElement = linkingFunction($scope); // and link it with your scope
    
        element.append(linkedElement);
    });
    

    【讨论】:

    • 谢谢,我尝试使用 templateUrl 而不是 $http.get 所以不再需要编译了。
    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2014-04-09
    • 1970-01-01
    相关资源
    最近更新 更多