【问题标题】:Javascript & knockoutjs: how to refactor the following code to be able to access the properties outside the functionJavascript & knockoutjs:如何重构以下代码以便能够访问函数外部的属性
【发布时间】:2021-04-14 21:34:28
【问题描述】:

我正在努力寻找一种方法来获取函数之外可用的属性 Override & Justification。代码是:

 self.CasOverridesViewModel = ko.observable(self.CasOverridesViewModel);

 var hasOverrides = typeof self.CasOverridesViewModel === typeof(Function);

    if (hasOverrides) {
        self.setupOverrides = function() {
            var extendViewModel = function(obj, extend) {
                for (var property in obj) {
                    if (obj.hasOwnProperty(property)) {
                        extend(obj[property]);
                    }
                }
            };

            extendViewModel(self.CasOverridesViewModel(), function(item) {

                item.isOverrideFilledIn = ko.computed( function() {
                    var result = false;

                    if (!!item.Override()) {
                        result = true;
                    }

                    return result;
                });

                if (item) {
                    item.isJustificationMissing = ko.computed(function() {
                        var override = item.Override();
                        var result = false;
                        
                        if (!!override) {
                            result = !item.hasAtleastNineWords();
                        }

                        return result;
                    });

                    item.hasAtleastNineWords = ko.computed(function() {
                        var justification = item.Justification(),
                            moreThanNineWords = false;

                        if (justification != null) {
                            moreThanNineWords = justification.trim().split(/\s+/).length > 9;
                        } 

                        return moreThanNineWords;
                    });

                    item.isValid = ko.computed(function() {
                        return (!item.isJustificationMissing());
                    });
                }
            });
        }();
    }

我已经尝试过设置一个全局变量,例如:

var item;
or
var obj;

if(hasOverrides) {...


所以最让我感动的是我无法掌握连接是如何建立的 底层模型 CasOverridesviewModel 之间。正如我假设 self.CasOverridesViewModel.Override() 将能够获取写入屏幕上的数据。

我做的另一个尝试是 var override = ko.observable(self.CasOverridesViewModel.Override()),这导致了 js typeError,因为您无法从未定义的对象中读取。

因此,如果有人能够就如何从此函数之外可用的输入字段中获取字段提供一些指导。将不胜感激。 如果我需要澄清某些方面,请不要犹豫。

感激不尽!

【问题讨论】:

  • 目前还不是很清楚您面临的问题是什么:您的第一个 sn-p 有什么问题吗?如果是这样,它到底是什么?另外,self.CasOverridesViewModel 在您的 sn-p 的第一行中分配值之前包含什么?

标签: javascript asp.net-mvc knockout.js


【解决方案1】:

不知道你想用你的变量去多远,但如果你只是在根级别定义你的全局变量,但只是在你的内部变量获得值时才添加到它,你不会得到设置错误未定义。

var root = {
  override: ko.observable()
};

root.override.subscribe((val) => console.log(val));

var ViewModel = function () {
  var self = this;
  self.override = ko.observable();
  
  self.override.subscribe((val) => root.override(val));
  
  self.load = function () {
    self.override(true);
  };
  
  self.load();
};

ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多