در پست قبلی با مفاهیم کنترلر و مدل در AngularJs آشنا شدید. قصد دارم روشی را بررسی کنم که یک منبع داده را بین کنترلهای تعریف شده در یک ماژول را به اشتراک بگذاریم.
ابتدا یک فایل جاوااسکریپ به نام module1 ایجاد میکنیم . در این فایل ابتدا ماژول خود را به Angular معرفی کرده و سپس با استفاده از دستور factory سرویس مورد نظر برای به اشتراک گذاری داده را میسازیم:
همان طور که در پست قبلی شرح داده شده برای تعریف ماژول از دستور angular.module استفاده میکنیم. در خط بعدی یک سرویس به نام BookData را با استفاده از دستور factory در ماژول مربوطه ساخته میشود. تابع مورد نظر بک آرایه از کتابها را که هر کدام از آنها شامل کد و نام است برگشت میدهد. قصد داریم کنترلهای تعریف شده در ماژول myApp بتوانند به این لیست این کتابها دسترسی داشته باشند. در این مرحله ابتدا یک کنترلر به نام به controller1 به صورت زیر میسازیم:
تنها نکته قابل ذکر، تزریق مقادیر scope$ و BookData به تابع سازنده کنترلر مربوطه است. از scope$ برای مقید سازی مقادیر مدل به عناصر dom در view استفاده میشود و BookData در این جا دقیقا به مقدار برگشت داده شده از سرویس BookData اشاره میکند(نام سرویس مورد نظر دقیقا باید با مقداری که به عنوان آرگومان اول در تابع factory پاس میدهید یکی باشد). در نتیجه این مقدار را به متغیر books در scope$ نسبت میدهیم. برای کنترلر دوم نیز همین مراحل را تکرار میکنیم:
در View مورد نظر نیز یک ارجاع به فایل ساخته شده بالا خواهیم داشت و سپس کدهای مربوط به نمایش را به صورت زیر مینویسیم(البته ارجاع به فایل اصلی angular.js فراموش نشود):
ابتدا در تگ div اول با استفاده از ng-app محدوده ماژول مورد نظر در صفحه را تعیین کرده سپس با استفاده از تگهای div جداگانه هر کدام از نواحی تحت کنترل مربوط به کنترلرهای تعریف شده را مشخص میکنیم.
با استفاده از ng-repeat به راحتی در بین آرایه کتابها پیمایش کرده و لیست مورد نظر در صفحه نمایش داده میشود. (توضیحات مربوط به ng-repeat و {{}} در پست قبلی شرح داده شده است). خروجی به صورت زیر خواهد بود. واضح است که اطلاعات نمایش داده شده توسط هر دو کنترلر به دلیل استفاده از منبع داده ای یکسان، به یک شکل خواهد بود.
ابتدا یک فایل جاوااسکریپ به نام module1 ایجاد میکنیم . در این فایل ابتدا ماژول خود را به Angular معرفی کرده و سپس با استفاده از دستور factory سرویس مورد نظر برای به اشتراک گذاری داده را میسازیم:
var app = angular.module('myApp', []); app.factory('BookData', function () { var books = [ { code: 1, name: 'book1', }, { code: 2, name: 'book2', }, { code: 3, name: 'book3', }, { code: 4, name: 'book4', }, { code: 5, name: 'book5', } ]; return books; });
app.controller('controller1', function ($scope, BookData) { $scope.books = BookData; });
app.controller('controller2', function ($scope, BookData) { $scope.books = BookData; });
<script type="text/javascript" src="~/scripts/app/controller1.js"></script>
<div ng-app="myApp"> <div ng-controller="controller1"> <p>Data from controller1</p> <table> <tr ng-repeat="book in books"> <td> {{book.code}} </td> <td> {{book.name}} </td> </tr> </table> </div> <div ng-controller="controller2"> <p>Data from controller2</p> <table> <tr ng-repeat="book in books"> <td> {{book.code}} </td> <td> {{book.name}} </td> </tr> </table> </div> </div>
با استفاده از ng-repeat به راحتی در بین آرایه کتابها پیمایش کرده و لیست مورد نظر در صفحه نمایش داده میشود. (توضیحات مربوط به ng-repeat و {{}} در پست قبلی شرح داده شده است). خروجی به صورت زیر خواهد بود. واضح است که اطلاعات نمایش داده شده توسط هر دو کنترلر به دلیل استفاده از منبع داده ای یکسان، به یک شکل خواهد بود.