Angularjs 默认值的角度js初始ng模型

Angularjs 默认值的角度js初始ng模型,angularjs,Angularjs,假设您有一个表单,其中包含从数据库加载的值。如何初始化ng模型 例如: <input name="card[description]" ng-model="card.description" value="Visa-4242"> 这是新角度应用中的常见错误。如果可以避免的话,您不希望将值写入服务器上的HTML中。如果事实上,如果你能摆脱让你的服务器完全呈现HTML,那就更好了 理想情况下,您希望发送您的Angular HTML模板,然后通过JSON中的$http下拉您的值并将它们放

假设您有一个表单,其中包含从数据库加载的值。如何初始化ng模型

例如:

<input name="card[description]" ng-model="card.description" value="Visa-4242">

这是新角度应用中的常见错误。如果可以避免的话,您不希望将值写入服务器上的HTML中。如果事实上,如果你能摆脱让你的服务器完全呈现HTML,那就更好了

理想情况下,您希望发送您的Angular HTML模板,然后通过JSON中的$http下拉您的值并将它们放入您的范围中

因此,如果可能,请执行以下操作:

app.controller('MyController', function($scope, $http) {
    $http.get('/getCardInfo.php', function(data) {
       $scope.card = data;
    });
});

<input type="text" ng-model="card.description" />

我希望这会有所帮助。

如果你不能按照@blesh的建议重新编写你的应用程序(使用$http或$resource向下拉JSON数据并填充$scope),你可以使用以下替代方法:



另请参见

我尝试了@Mark Rajcok的建议。它适用于字符串值(Visa-4242)。 请参考这个

从小提琴上:

使用
ng repeat
,大家都可以推荐在小提琴上做同样的事情。但是在阅读了@Mark Rajcok给出的答案之后,我只想对一个具有配置文件数组的表单进行同样的尝试。 在我拥有$scope.profiles=[{},{}]之前,一切都很顺利;控制器中的代码。如果我删除这个代码,我会得到错误。 但在正常情况下,我无法打印
$scope.profiles=[{},{}]当我从服务器打印或回显html时。

是否可以像@Mark Rajcok对字符串值(如
)所做的那样执行上述操作,而不必从服务器回显JavaScript部分。

这显然是AngularJS缺少的,但很容易添加的修复程序。只需编写一个快速指令,从输入字段设置模型值

<input name="card[description]" value="Visa-4242" ng-model="card.description" ng-initial>

刚刚在Ryan Montgomery的“修复”中添加了对select元素的支持


500多
在250到500之间
在100到250之间
在50到100之间
20到50岁之间
少于20
应用指令('ngInitial',函数(){
返回{
限制:“A”,
控制器:['$scope','$element','$attrs','$parse',函数($scope,$element,$attrs,$parse){
val=$attrs.sbInitial | |$attrs.value | |$element.val()| |$element.text()
getter=$parse($attrs.ngModel)
setter=getter.assign
setter($scope,val)
}]
}

}))

IMHO最好的解决方案是@Kevin Stone指令,但我必须升级它,使其在各种条件下都能工作(如select、textarea),而这一个确实有效:

    angular.module('app').directive('ngInitial', function($parse) {
        return {
            restrict: "A",
            compile: function($element, $attrs) {
                var initialValue = $attrs.value || $element.val();
                return {
                    pre: function($scope, $element, $attrs) {
                        $parse($attrs.ngModel).assign($scope, initialValue);
                    }
                }
            }
        }
    });

正如其他人指出的,在视图上初始化数据不是一个好的做法。 但是,建议在控制器上初始化数据。(见附件)

这样你就可以写作了

<input name="card[description]" ng-model="card.description">

这样,视图不包含数据,控制器在加载实际值时初始化值。

如果您喜欢上面Kevin Stone的方法 考虑编写一个更简单的方法来为特定的标签编写指令,例如“输入”。p>
app.directive('input', function ($parse) {
    return {
        restrict: 'E',
        require: '?ngModel',
        link: function (scope, element, attrs) {
            if (attrs.ngModel) {
                val = attrs.value || element.text();
                $parse(attrs.ngModel).assign(scope, val);
            }
        }
    }; });

如果你走这条路线,你就不必担心在每个标签上都添加ng首字母。它会自动将模型的值设置为标记的“值”属性。如果不设置value属性,它将默认为空字符串。

如果URL中有init值,如
mypage/id
,则在angular JS的控制器中,可以使用
location.pathname
查找id并将其分配给所需的模型。

以下是一种以服务器为中心的方法:

<html ng-app="project">
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <script>
        // Create your module
        var dependencies = [];
        var app = angular.module('project', dependencies);

        // Create a 'defaults' service
        app.value("defaults", /* your server-side JSON here */);

        // Create a controller that uses the service
        app.controller('PageController', function(defaults, $scope) {
            // Populate your model with the service
            $scope.card = defaults;
        });
    </script>

    <body>
        <div ng-controller="PageController">
            <!-- Bind with the standard ng-model approach -->
            <input type="text" ng-model="card.description">
        </div>
    </body>
</html>

并通过您选择的服务器端技术将其放入您的页面。这里有一个要点:

您也可以在HTML代码中使用:
ng init=“card.description=12345”

Angular公司不推荐使用该控制器,如上所述,您应专门使用控制器


但它是有效的:)

您可以使用自定义指令(支持文本区域、选择、广播和复选框),查看这篇博文。

这是上述想法的更通用版本。。。 它只是检查模型中是否有任何值,如果没有,则将值设置为模型

JS:

HTML(用法示例):


我有一个简单的方法,因为我的表单中有一些繁重的验证和掩码。因此,我使用jquery再次获取我的值,并触发事件“change”进行验证:

$('#myidelement').val('123');
$('#myidelement').trigger( "change");

是的,这很有帮助。我想我只是对那些棱角分明的家伙做出这个决定感到震惊。不要感到震惊。。。HTML的呈现正在从服务器转移到浏览器。现在JavaScript中有几十个MVC框架,对于服务器来说,仅仅将JSON/XML数据托管到JavaScript应用程序比呈现服务器上的每个页面要高效得多。它将大量工作转移到客户机上,而不是让服务器承担。更不用说它节省了带宽。最重要的是,您可以有一个本地移动应用程序(或任何真正的应用程序),通过HTTP使用相同的JSON。这就是未来。@blesh:回答得很好。谢谢。我同意这是前进的方向,我自己也已经开始采用这种方法;您是否有任何支持此声明的链接?我还担心,将html的呈现从服务器移动到客户端可能会导致页面加载时间变慢,特别是在移动设备中,您可能会呈现大量html,例如导航树。我不认为这是一个“错误”。在某些情况下,客户端呈现是最好的解决方案。在其他情况下,服务器端渲染是一种方法。这两种技术都可以使用角度渲染,客户端渲染不应该被认为是“角度方式”,因为它不是。角度比那更灵活。@blesh,当然,在任何情况下,搜索引擎优化是重要的,但爬虫程序替代内容的成本高于使用嵌入式数据实现angular的成本——任何对感知速度或用户体验呈现时间具有极高价值的应用程序——许多内容网站和电子商务网站都会属于其中之一类别。t的工程师们
<select class="input-control" ng-model="regCompModel.numberOfEmployeeId" ng-initial>
    <option value="1af38656-a752-4a98-a827-004a0767a52d"> More than 500</option>
    <option value="233a2783-db42-4fdb-b191-0f97d2d9fd43"> Between 250 and 500</option>
    <option value="2bab0669-550c-4555-ae9f-1fdafdb872e5"> Between 100 and 250</option>
    <option value="d471e43b-196c-46e0-9b32-21e24e5469b4"> Between 50 and 100</option>
    <option value="ccdad63f-69be-449f-8b2c-25f844dd19c1"> Between 20 and 50</option>
    <option value="e00637a2-e3e8-4883-9e11-94e58af6e4b7" selected> Less then 20</option>
</select>

app.directive('ngInitial', function () {
return {
    restrict: 'A',
    controller: ['$scope', '$element', '$attrs', '$parse', function ($scope, $element, $attrs, $parse) {
        val = $attrs.sbInitial || $attrs.value || $element.val() || $element.text()
        getter = $parse($attrs.ngModel)
        setter = getter.assign
        setter($scope, val)
    }]
}
    angular.module('app').directive('ngInitial', function($parse) {
        return {
            restrict: "A",
            compile: function($element, $attrs) {
                var initialValue = $attrs.value || $element.val();
                return {
                    pre: function($scope, $element, $attrs) {
                        $parse($attrs.ngModel).assign($scope, initialValue);
                    }
                }
            }
        }
    });
<input name="card[description]" ng-model="card.description">
$scope.card = { description: 'Visa-4242' };

$http.get('/getCardInfo.php', function(data) {
   $scope.card = data;
});
app.directive('input', function ($parse) {
    return {
        restrict: 'E',
        require: '?ngModel',
        link: function (scope, element, attrs) {
            if (attrs.ngModel) {
                val = attrs.value || element.text();
                $parse(attrs.ngModel).assign(scope, val);
            }
        }
    }; });
<html ng-app="project">
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <script>
        // Create your module
        var dependencies = [];
        var app = angular.module('project', dependencies);

        // Create a 'defaults' service
        app.value("defaults", /* your server-side JSON here */);

        // Create a controller that uses the service
        app.controller('PageController', function(defaults, $scope) {
            // Populate your model with the service
            $scope.card = defaults;
        });
    </script>

    <body>
        <div ng-controller="PageController">
            <!-- Bind with the standard ng-model approach -->
            <input type="text" ng-model="card.description">
        </div>
    </body>
</html>
{
    description: "Visa-4242"
}
function defaultValueDirective() {
    return {
        restrict: 'A',
        controller: [
            '$scope', '$attrs', '$parse',
            function ($scope, $attrs, $parse) {
                var getter = $parse($attrs.ngModel);
                var setter = getter.assign;
                var value = getter();
                if (value === undefined || value === null) {
                    var defaultValueGetter = $parse($attrs.defaultValue);
                    setter($scope, defaultValueGetter());
                }
            }
        ]
    }
}
<select class="form-control"
        ng-options="v for (i, v) in compressionMethods"
        ng-model="action.parameters.Method"
        default-value="'LZMA2'"></select>
$('#myidelement').val('123');
$('#myidelement').trigger( "change");