如何使用 angularjs 指令对 mvc 局部视图进行数据绑定
How to data-bind an mvc partial view using angularjs directives
我有以下 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 控制器和 returns 一个局部视图
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 指令以便能够对部分视图中的元素进行数据绑定。我错过了什么??
提前致谢。
您缺少的可能是模板的 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);
});
我没有看到使用 $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
的父范围值的值。请参阅以下代码段。
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>
我有以下 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 控制器和 returns 一个局部视图
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 指令以便能够对部分视图中的元素进行数据绑定。我错过了什么??
提前致谢。
您缺少的可能是模板的 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);
});
我没有看到使用 $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
的父范围值的值。请参阅以下代码段。
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>