Rumah > Artikel > hujung hadapan web > Cara menggunakan $parse atau $eval untuk memberikan nilai kepada pembolehubah Skop semasa masa jalan dalam AngularJS_AngularJS
Dalam "Menyesuaikan Arahan tentang jadual dalam AngularJS", Direcitve tentang jadual diperibadikan seperti ini:
<table-helper datasource="customers" clumnmap="[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]"></table-helper>
Di atas, nilai colmnmap pembolehubah dipratakrifkan dalam Skop:
return { restrict: 'E', scope: { columnmap: '=', datasource: '=' }, link:link, template:template };
Dalam AngularJS, terdapat juga cara untuk menetapkan nilai kepada pembolehubah Skop semasa masa jalan, iaitu menggunakan kaedah $parse atau $eval dalam fungsi pautan.
Pembentangan Direcitve adalah sama seperti sebelum ini:
<table-helper-with-parse datasource="customers" columnmap="[{name: 'Name'},...]"></table-helper-with-parse>
Arahan lebih kurang seperti ini:
var tableHelperWithParse = function($parse){ var template = "", link = function(scope, element, attrs){ var headerCols = [], tableStart = '<table>', tableEnd = '</table>', table = '', visibleProps = [], sortCol = null, sortDir = 1, columnmap = null; $scope.$watchCollection('datasource', render); //运行时赋值columnmap columnmap = scope.$eval(attrs.columnmap); //或者 columnmap = $parse(attrs.columnmap)(); wireEvents(); function rener(){ if(scope.datasource && scope.datasourse.length){ table += tableStart; table += renderHeader(); table += renderRows() + tableEnd; renderTable(); } } }; return { restrict: 'E', scope: { datasource: '=' }, link: link, template: template } } angular.module('direcitvesModule') .directive('tableHelperWithParse', tableHelperWithParse);
Izinkan saya memperkenalkan kepada anda perbezaan antara $parse dan $eval
Pertama sekali, $parse dan $eval digunakan untuk menghuraikan ungkapan, tetapi $parse wujud sebagai perkhidmatan yang berasingan. $eval digunakan sebagai kaedah skop.
Penggunaan biasa $parse adalah untuk menetapkan nilai ungkapan rentetan yang dipetakan kepada objek sebenar. Anda juga boleh mendapatkan nilai yang sepadan dengan ungkapan secara langsung daripada $parse.
var getter = $parse('user.name'); var setter = getter.assign; setter(scope, 'new name'); getter(context, locals) // 传入作用域,返回值 setter(scope,'new name') // 修改映射在scope上的属性的值为‘new value'
$eval ialah skop.$eval, yang melaksanakan ungkapan dalam skop semasa, seperti: skop.$eval('a b'); dan a dan b di sini datang daripada skop = {a: 2, b: 3};
Lihat kod sumber dan pelaksanaannya ialah
$eval: function(expr, locals) { return $parse(expr)(this, locals); },
Anda boleh mendapati ia juga berdasarkan $parse, tetapi parameternya telah ditetapkan pada ini, iaitu skop semasa, jadi $eval hanyalah pakej berdasarkan $parse, dan merupakan API pantas untuk $parse .