В моем приложении я возвращаю представление ниже, которое использует этот TestViewModel.
public class TestViewModel
{
public List<string> Tests { get; set; }
}
Посмотреть:
@model AdminSite.Models.TestsViewModel
@{
ViewBag.Title = "Tests";
}
<hgroup class="title">
<h1>@ViewBag.Title</h1>
</hgroup>
<!doctype html>
<html>
<head>
<script src="~/Scripts/Angular/angular.min.js"></script>
<script src="~/Scripts/Angular/Tests.js"></script>
</head>
<body>
<div ng-app="testsTable">
<div ng-controller="TableController">
<table my-table options="options"></table>
</div>
</div>
</body>
</html>
Как вы видите, я использую AngularJS для создания DataTable, но мне хотелось бы, чтобы вместо данных таблицы "aaData" было жестко запрограммировано, я хочу, чтобы это было из модели TestViewModel.
var app = angular.module('testsTable', []);
app.directive('myTable', function () {
return {
restrict: 'A',
link: function (scope, element, attrs, controller) {
var dataTable = element.dataTable(scope.options);
},
scope: {
options: "="
}
};
});
app.controller('TableController', ['$scope', function ($scope) {
$scope.options = {
aoColumns: [
{
"sTitle": "Col 1",
},
{
"sTitle": "Col 2"
},
{
"sTitle": "Col 3"
}
],
aoColumnDefs: [{
"bSortable": true,
}],
bJQueryUI: true,
bDestroy: true,
aaData: [
["A", "B", "C"],
["A", "B", "C"],
]
};
}]);
Я думаю, мне, возможно, придется создать другую директиву для привязки модели, например
<table my-table options="options" model-data="@Model.Tests"></table>
но я не совсем уверен, как работают угловые директивы, как я буду писать указанную директиву и как она связывает ее с областью
Итак... Настройка aaData с помощью {{options.aaData=JSON.parse('@Html.Raw(@Model.Tests)');""}}
работала, но я ничего не контролировал, чтобы изменить значение таблицы перерисовывается с новой информацией.
для отслеживания изменений Я добавил часы в свою директиву, это отслеживает aaData для изменений, а затем обновляет таблицу по мере необходимости.
scope.$watch('options.aaData', handleUpdate, true);
function handleUpdate(newData) {
var data = newData || null;
if (data) {
dataTable.fnClearTable();
dataTable.fnAddData(newData);
}
}
мое реальное решение выглядит немного иначе, поскольку я использую dataTables ajax call, чтобы вытащить мои json-данные, а затем установить dataSrc с результатом. Использование встроенных вызовов ajax означает, что я могу удалить директивные часы, поскольку datatables обрабатывает это для меня.
Наконец, если вы нашли себя здесь, когда выяснили, как смешивать угловые данные и данные, то эта скрипка мне очень помогла. http://jsfiddle.net/TNy3w/2/
Поскольку вы работаете с угловыми, используйте угловую конфигурацию:
<script>
(function () {
angular.module('app').value('mydata', {
propOne: '@Url.Action("Index", "Dirty", null)',
propTwo: angular.fromJson('@Html.Raw(Model.Addresses)')
// more properties here
});
})();
</script>
Затем вы можете вводить и использовать "mydata" в любом месте вашего углового приложения
EDIT: вы можете создать метод расширения, который сериализует вашу модель в JSON, тогда Html.Raw
не даст вам ошибку, если параметр, который вы предоставляете, не равен нулю.
public static class ObjectExtensions { public static string SerializeObject(this object obj) { return JsonConvert.SerializeObject( obj, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); } }
Затем выполните:
@using [static extension class namespace here];... angular.fromJson('@Html.Raw(Model.Addresses.SerializeObject())')
Ваш вопрос отвечает здесь
Вы можете прямо вставлять значения в JavaScript:
//View.cshtml
<script type="text/javascript">
var arrayOfArrays = JSON.parse('@Html.Raw(Model.Addresses)');
</script>
См. JSON.parse
, Html.Raw
В качестве альтернативы вы можете получить значения через Ajax:
public ActionResult GetValues()
{
// logic
// Edit you don't need to serialize it just return the object
return Json(new { Addresses: lAddressGeocodeModel });
}
<script type="text/javascript">
$(function() {
$.ajax({
type: 'POST',
url: '@Url.Action("GetValues")',
success: function(result) {
// do something with result
}
});
});
</script>
См. jQuery.ajax