Angular JS,绑定范围 属性 到函数

Angular JS, bind scope property to function

我是 Angular JS 的新手。我正在创建一个将数据存储在网络存储中的应用程序。提交查询表单时,它会从网络存储中获取当前数组,对新表单数据进行分类,将其添加到数组中,然后将其发送回网络存储。效果很好,所有内容都已正确保存。

$scope.submit = function () {
   // get object from form data
    var formData = { firstName: $scope.firstName, lastName: $scope.lastName, date: getDateFromatted(), posted: false };
    addStoredData(formData, ENQUIRY_STORE);
}

function getStoredData(storeName) {
    // get or create enquiry store
    var storedData = (typeof localStorage.getItem(storeName) !== 'undefined' && localStorage.getItem(storeName)) || "[]";

    // parse store into object
    storedData = JSON.parse(storedData);

    return storedData;
}

function addStoredData(data, storeName) {
     var storedData = getStoredData(storeName);
     var count = storedData.length;

     // form data into next submission slot
     storedData[count] = data;

     // turn back into JSON
     storedData = JSON.stringify(storedData);

     // slap it back in web storage
     localStorage.setItem(storeName, storedData);
}

在我的 HTML 页面上我有这个;

<table>
    <tr>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Date</th>
    </tr>

    <tr ng-repeat="e in enquiries">
        <td>{{ e.firstName }}</td>
        <td>{{ e.lastName }}</td>
        <td>{{ e.date }}</td>
    </tr>
</table>

所以我希望能够做到这一点...

// list of stored enquiries
$scope.enquiries = function () {
    return getStoredData(ENQUIRY_STORE);
}

但它没有绑定,也没有行。如果我这样做...

$scope.enquiries = getStoredData(ENQUIRY_STORE);

可以用,但是当有新询盘时,我必须继续设置它。也许 Anulgar 不允许您使用 return 数据的函数进行绑定,但我认为可以。

非常感谢任何帮助。谢谢。

$scope.selectedENQUIRY_STORE = null;
$scope.getStoredData= function (e) {
    $scope.selectedENQUIRY_STORE = e;
};

当您点击名称上的那个查询表时它会绑定

您只需在提交后再次检索数据,因此将您的 $scope.enquiries() 函数移动到您的 $scope.submit()函数。

$scope.submit = function () {
   // get object from form data
    var formData = { firstName: $scope.firstName, lastName: $scope.lastName, date: getDateFromatted(), posted: false };
    addStoredData(formData, ENQUIRY_STORE);

// FIRE UP THE FUNCTION
$scope.enquiries();
}

请注意,您应该将 getStoredData() 和其他数据相关函数放入 angular 服务中。

幸运的是,已经有一个很好的模块来处理 LocalStorage 操作: https://github.com/tymondesigns/angular-locker

第一种方式 ($scope.enquiries = function() ...) 它不绑定,因为你正在对函数进行 ngRepeat (它不会抛出错误,因为函数实际上有一个长度)。

但是,即使您这样做了 <tr ng-repeat="e in enquiries()">,您也会遇到无限摘要错误,因为 enquiries() 每次都返回不同的对象,而 angular 正在等待两次相同的结果才能停止摘要循环。

最好的方法是:

$scope.submit = function() {
  ...
  setEnquiries();
}

...

function setEnquiries() {
  $scope.enquiries = getStoredData(ENQUIRY_STORE);
}

并不断循环查询:

<tr ng-repeat="e in enquiries">