javascript - 即使在 $scope 变量更新数据后 UI 也不会更新

标签 javascript html angularjs angularjs-scope

我正在通过服务获取 View 数据并使用 angular.copy() 分配给局部变量;

var init = function () {
        $scope.product = angular.copy(EditItemFactory.getSelectedItem());

    }

View of my UI after calling init function

$scope.UpdateItem = function (data) {
        console.log(data);
        var Data = DataFactory.UpdateItem(data);

        if (parseInt(Data) != 0) {

            $modalInstance.dismiss('Close');
        } else {
            console.log(Data);
        }
    }

我正在传递更新函数来更新项目并存储在数据库中。

但是在数据库中更新之后,数据正​​在 UI 中更新

这是我的 Controller 的完整代码:

(function () {

var productEditCtrl = function ($scope, $modalInstance, EditItemFactory, DataFactory) {




    $scope.cancel = function () {
        $modalInstance.dismiss('Close');
    };

    $scope.UpdateItem = function (data) {
        console.log(data);
        var Data = DataFactory.UpdateItem(data);

        if (parseInt(Data) != 0) {

            $modalInstance.dismiss('Close');
        } else {
            console.log(Data);
        }
    }

    var init = function () {
        $scope.product = angular.copy(EditItemFactory.getSelectedItem());

    }

    init();
}
productEditCtrl.$inject = ['$scope', '$modalInstance', 'EditItemFactory', 'DataFactory']
angular.module("SplitWise").controller("productEditCtrl", productEditCtrl)())

我没有找到将更改绑定(bind)到 UI 的方法。

注意:我只想在更新数据存储到数据库后更新 UI

数据工厂代码:

(function(){

var DataFactory = function($http)
{
    var factory = {};




    factory.getAllItems = function()
    {
        return $http.get("http://localhost:8080/GetAllItems")
    }

    factory.DeleteItem = function(Product)
    {

        $http.post("http://localhost:8080/DeleteItem",{"Model":Product.MODEL_NUMBER}).success(function(data){
            return data;
        }).error(function(err)
                {
            return err;
        })
    }

    factory.UpdateItem = function(Product)
    {

        $http.post("http://localhost:8080/UpdateItem",{"Model":Product.MODEL_NUMBER,"Name":Product.NAME,"MSRP":Product.MSRP,"Quantity":Product.QUANTITY}).success(function(Data){
            return Data;
        }).error(function(err){
            return err;
        })
    }
    return factory
}
DataFactory.$inject=['$http']
angular.module('SplitWise').factory("DataFactory",DataFactory)

}())

最佳答案

$http.post 是异步的,所以 UpdateItem 函数在从服务器接收到数据之前返回 Data 因此它是 未定义。你要做的是等到它被成功分配,然后用它做一些事情。

var DataFactory = function($http) {

// ...

factory.UpdateItem = function(Product)
    {    
        return $http.post("http://localhost:8080/UpdateItem",{"Model":Product.MODEL_NUMBER,"Name":Product.NAME,"MSRP":Product.MSRP,"Quantity":Product.QUANTITY});
    }

// ...

}

然后像这样使用 UpdateItem 函数:

$scope.UpdateItem = function (data) {
    console.log(data);
    DataFactory.UpdateItem(data).then(function(resp) {

        if (parseInt(resp.data) != 0) {

            $modalInstance.dismiss('Close');
        } else {
            console.log(resp);
        }
    }, function(err) {
        console.log(err);
    });
}

关于javascript - 即使在 $scope 变量更新数据后 UI 也不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43649282/

相关文章:

javascript - 如何使用 webpack 包含 VelocityJS

javascript - 使用代码从 HTML 表单中获取所有输入字段名称

javascript - 将表单输入限制为单个数字

javascript - 在 Angular JS 中从模型检索 id 到 Controller

javascript - 如何更新 AngularJS 中多个 Controller 共享服务属性的异步模型更改的绑定(bind)?

持续集成过程中的Javascript性能测试

Javascript无损图像压缩

html - 在单词之间的空白处换行后更改字体大小

Javascript 语法和 HTML 实体

angularjs - 如何创建具有多个选项的动态单选按钮